No.14448![]() |
scanfでの入力書式チェック 投稿者---とおり(2004/06/04 15:15:33) |
||
scanfは使い難いという印象があり、使うのを避けていたのですが、 こちらの掲示板で探索集合(%[])や代入抑制(%*)の存在を知って少し印象が変わり、今再勉強しています。 それらを使えば入力書式チェックも同時にできて便利そうです。 下記は小文字、大文字、数字を入力して表示するプログラムです。 まずVer.1のように組んだのですが、これだと入力例Cがうまくいきません。 そこでVer.2のようにしてみたのですが、これだと入力例BがNGとなってしまいます。 Ver.3では改行文字もホワイトスペースとして飛ばされてしまうのでダメでした。 試しにVer.4のようにもしてみましたがダメでした。 なにかいい方法は無いでしょうか。 --- [Ver.1実行例] >aaa:AAA:111<Enter> // 入力例A [aaa][AAA][111] > aaa : AAA : 111 <Enter> // 入力例B [aaa][AAA][111] >aaa:AAA:111@@@<Enter> // 入力例C [aaa][AAA][111] // 余計な文字列があるのでNGと表示したい --- #include <stdio.h> int main(void) { char buf[256]; char d1[9], d2[9], d3[9]; char end[2]; while ( 1 ) { printf(">"); fgets(buf, 256, stdin); if ( sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9]", d1, d2, d3) == 3 ) { /* Ver.1 */ /* if ( sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9]%1[\n]", d1, d2, d3, end) == 4 ) { /* Ver.2 */ /* if ( sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9] %1[\n]", d1, d2, d3, end) == 4 ) { /* Ver.3 */ /* if ( sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9]%*[ \t]%1[\n]", d1, d2, d3, end) == 4 ) { /* Ver.4 */ printf("[%s][%s][%s]\n", d1, d2, d3); } else { printf("NG\n"); } } return 0; } |
No.14450![]() |
Re:scanfでの入力書式チェック 投稿者---かずま(2004/06/04 15:42:07) |
||
if (sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9] %c", d1, d2, d3, end) == 3) { /* Ver.5 */ char end[2]; の代わりに、char end[1]; で十分。 あるいは、char end; として sscanf(..., &end) も可。 |
No.14457![]() |
Re:scanfでの入力書式チェック 投稿者---とおり(2004/06/04 17:41:25) |
||
返信ありがとうございます。 なるほど、最後が改行ならOK、ではなく、 最後になにもなければOK、とすればいいんですね。 BCB5では望み通りの動きをしました。 しかし、LSI C-86ではうまくいきませんでした。 どうも%cは'\0'をも代入してしまうみたいです。 これはコンパイラの問題なのでしょうか。 Ver.6のように%sで代用すると望み通りの動きをしました。 --- [Ver.5実行例] >aaa:AAA:111<Enter> NG ' ':H'00 --- #include <stdio.h> int main(void) { char buf[256]; char d1[9], d2[9], d3[9]; char end; char str[256]; int n; while ( 1 ) { printf(">"); fgets(buf, 256, stdin); if ( (n = sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9] %c", d1, d2, d3, &end)) == 3 ) { /* Ver.5 */ /* if ( (n = sscanf(buf, " %8[a-z] : %8[A-Z] : %8[0-9] %s", d1, d2, d3, &str)) == 3 ) { /* Ver.6 */ printf("[%s][%s][%s]\n", d1, d2, d3); } else { printf("NG\n"); } if ( n == 4 ) printf("'%c':H'%02X\n", end, (unsigned char)end); } return 0; } |