2016-05-08 10 views
9

私はその行にsscanfを付けて、私が望んでいたものが何もないことを確認したいと思います。私は以下のように入力を取得するとどのようにsscanfは、バッファがまさに私が望んでいたことを確認するには?

void parse_init_command(char *buffer, command *new_command) { 
    if (sscanf(buffer, 
     "%s %d %d %d %d %d %d %d\n", 
     new_command->name, 
     &new_command->data[0], 
     &new_command->data[1], 
     &new_command->data[2], 
     &new_command->data[3], 
     &new_command->data[4], 
     &new_command->data[5], 
     &new_command->data[6]) != 8) { 
     strncpy(new_command->name, "WRONG_INPUT", 15); 
    } 
} 

:コードは次のようになります

INIT 9 11 3 1 1 1 9 

すべてが正常であるが、その後、この

INIT 9 11 3 1 1 1 9 s 

などの入力も受け入れられています。私は、すべての入力行がEOLで終わっていることを知っているので、 "\ n"を追加するとすべてがうまくいくと思っていましたが、そうではありませんでした。

+3

'scanf'は改行文字をタブとスペースのように空白として扱います。あなたは9番目のダミー値、強制された最大の短い文字列を読むことができます。 (%2s')おそらく、そして変換の数が8を超えないように強制してください。 –

+0

あなたのバッファはこの関数に渡される前に初期化されていますか? – bentank

答えて

2

あなたの入力が常に最後に改行を持っている場合、このようなことが起こります。コードにはcharの余分な種類が1つ必要で、それが\nであることと、スキャンされた項目の数が正しいことを確認します。これは成功のために1を印刷します - この例の目的のためにあなたの関数にわずかな違いがあります。キーボードから

#include <stdio.h> 

typedef struct { 
    char name[100]; 
    int data[7]; 
} command; 

int parse_init_command(char *buffer, command *new_command) { 
    char eol = 0; 
    int num = sscanf(buffer, "%s%d%d%d%d%d%d%d%c", 
           new_command->name, 
           &new_command->data[0], 
           &new_command->data[1], 
           &new_command->data[2], 
           &new_command->data[3], 
           &new_command->data[4], 
           &new_command->data[5], 
           &new_command->data[6], 
           &eol); 
    return num == 9 && eol == '\n'; 
} 

int main(void) 
{ 
    char inp[50]; 
    command rec; 
    fgets(inp, sizeof inp, stdin); 
    printf("%d\n", parse_init_command(inp, &rec)); 
    return 0; 
} 

プログラムセッション:それを持つことのポイントを破って、空白をスキップする原因となる%c前には先頭にスペースがない

INIT 9 11 3 1 1 1 9 
1 

INIT 9 11 3 1 1 1 9 s 
0 

注意。

+2

これは、ユーザが 'INIT 9 11 3 1 1 1 9'(最後にスペースを入れて)と入力すると、説明しづらいエラーが発生します。@ MOehmの解が好き(OPへのコメント)。 – rici

関連する問題