0

私は現在いくつかのコードに取り組んでおり、何か問題があることを知っています。私のコードは、ユーザーに名前を入力するように促し、fgets () or sscanf (). ユーザーが間違ったもの (つまり、数字または英数字の大文字と小文字) を入力した場合、エラー メッセージを出力し、ユーザーが入力権を入力するまで再度入力を求める必要があります。また、初期化しました:

char name [47];

printf ( "Name: " );

//some code dealing with newline character with the use of fgets

if ( (sscanf (name, %s, name)) == 1 )
    //some code dealing with this condition
else {
    do {
        printf ( "ERROR: Invalid name. Name should consist of letters only.\n" );
        printf ( "Name: " );
        if (fgets ( name, sizeof (name), stdin ) == '\0' )
            //some code dealing with EOF
    } while ((sscanf (name, %s, name)) != 1);
}

誰が何が悪いのか教えてもらえますか?

4

1 に答える 1

1
char name[47];
char line[4096];

while (printf("Name: ") > 0 && fgets(line, sizeof(line), stdin) != 0)
{
    if (sscanf(line, "%46s", name) != 1)
        ...empty line?...
    else if (valid_name(name))
        break;
    printf("Error: invalid name (%s). Name should consist of letters only.\n", name);
}

printf()印刷する文字数を返すことを忘れましたか? まあ、ほとんどの人はその結果を頻繁にテストするわけではありませんが、このコンテキストではそうすることは役に立ちます。テスト!= 6は単なる の代わりになる> 0可能性がありますが、実際にはどちらでも問題なく動作する可能性があります。

を使用して、バッファ オーバーフローのリスクなし"%46s"に値を読み込むことに注意してください。に改行を読み込まないことnameにも注意してください。sscanf()name

于 2013-08-27T04:32:04.940 に答える