3

私は C が初めてで、いくつかの演習を行っていますが、while ループで gets() に問題があります。検索では、\n 文字と関係があるのではないかと思いますが、ここで何が起こっているのかについて、誰かがより完全な説明をしてくれることを望んでいました:

このループは 1 回だけ実行されます。2 回目は「Enter last name」を画面に出力し、gets() が 2 回目の入力を受け取る前にループから抜け出します。

while (employee_num <= 10)
{
    printf("Enter last name ");
    gets(employee[employee_num].last_name);
    if(strlen(employee[employee_num].last_name) == 0)
        break;
    printf("Enter first name ");
    gets(employee[employee_num].first_name);
    printf("Enter title ");
    gets(employee[employee_num].title);
    printf("Enter salary ");
    scanf("%d", &employee[employee_num].salary);        
    ++employee_num;
}

前もって感謝します!

4

2 に答える 2

5

\n給与を読み取った後、入力バッファーに改行文字 ( ) があります。これは、2 回目の反復で姓として取り上げられています。getchar()最後の scanf の後にa を追加することで、それを無視できます。

while (employee_num <= 10) {
    ...
    printf("Enter salary ");
    scanf("%d", &employee[employee_num].salary);        
    ++employee_num;
    getchar();
}
于 2013-01-22T18:48:50.870 に答える
2

skjaidevによる回答を参照して、

の場合gets()改行文字 ( \n) が見つかった場合、文字列にコピーされません。これが問題の原因です。

また、 gets は とはかなり異なることに注意してくださいfgets: gets はstdinソースとして使用するだけでなくnewline、結果の文字列に終了文字を含めず、str の最大サイズを指定することを許可しません (これにより、バッファー オーバーフローが発生する可能性があります)。

プログラムで使用するのは悪い習慣であると考えられていますgets()

于 2013-01-22T18:51:24.467 に答える