C言語関係掲示板

過去ログ

No.1097 scanfでの入力書式チェック

[戻る] [ホームページ]
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;
}