3

2文字を読みたいので、次のコードを実行します。

main() {
    char a,b;

    printf("\nEnter the first char.. ");
    a=getchar();
    printf("\nEnter the second char.. ");
    b=getchar();
    b=getchar();       //<--I've to add this sentence because the previously doesn't work

    printf("\nFirst char --> %c",a);
    printf("\nSecond char --> %c",b);

}

コードは機能しないはずですが、機能します。出力は正しいです:

最初の文字 --> z

2 番目の文字 --> z (「z」または目的の文字)

2番目を削除するとgetchar()、出力は次のようになります。

最初の文字 --> z

2 番目の文字 --> (ここには文字はありません)

getchar()エラーなしで2番目を削除するにはどうすればよいですか?

fflush(stdin)getchar()は通用しないから。

4

4 に答える 4

7

これを試してください:正確に を含むサイズの2 バイトのファイルを作成しdataます。今言う:ab

./myprogram < data

そして出来上がり。

ポイントは、端末を操作aしてエンターキーを押すと、最初に改行の2文字をプロセスに送信することです。したがって、2番目は改行を取得します。a\ngetchar

(また、端末では、何かを送信する前にいっぱいになるライン バッファーがあるため、Enter キーを押さずに個々の文字を送信することはできません。)

要するに、getcharは貧弱な I/O プリミティブであり、ほとんどの場合fgets、行全体を読み取って処理することを優先する必要があります。

于 2012-08-05T23:18:07.903 に答える
2

他の回答で示されているように、問題はキャリッジ リターンが原因でした。

これを解決する方法はたくさんありますが、他の方法よりも複雑なものもあります。したがって、私が見つけた最も簡単な方法を示します。

GNU ウェブサイトがこれに最も適した機能を示しているので、getc(stream)引用します。

これはfgetcと同じですが、ストリーム 引数を複数回評価するマクロとして実装することが許容される (そして一般的) ことを除きます。getcは高度に最適化されていることが多いため、通常、1 文字の読み取りに使用するのに最適な関数です。

私はそれを実践しましたが、まだCRの問題があるので、この関数の結果を出力し、 CR のときに 10 を返すことに気付きました。この後、コードの機能と明快さを得ようとしました。これに対して可能な限りのことを行って、今私のコードは次のとおりです。

main() {
    char a,b;

    printf("\nEnter the first char.. ");
    if ((a=getc(stdin))==10) a=getc(stdin);
    printf("\nEnter the second char.. ");
    if ((b=getc(stdin))==10) b=getc(stdin);

    printf("\nFirst char --> %c",a);
    printf("\nSecond char --> %c",b);

}

そして素晴らしい出力:

最初の文字 --> z

2 番目の文字 --> z (「z」または目的の文字)


すべてのプログラムには、他のプログラムとは異なる独自のソリューションが必要であることを学びました。私が言えることは、「常にプログラムを適応させる必要があります。この文は私にとってはうまくいくかもしれませんが、他のコードではうまくいくとは限りません。」

私を助けてくれたすべての人に感謝します!

于 2012-08-06T04:09:00.433 に答える
1

getchar()関数が改行文字をキーボードバッファーに残しているようです。これは、最初b=getchar();の文字が改行文字を読み取り、2 番目の文字が期待する実際の入力を読み取ることを意味します。ignore()より洗練されたアプローチは、利用可能な関数がある場合、改行文字を無視することです。

于 2012-08-05T23:18:35.467 に答える
0

getchar()は 1 文字しか取得しません。newline には 1 文字が必要です。そのため、目的の入出力を取得するには、コードに getchar() を追加する必要があります。

于 2012-08-05T23:18:53.817 に答える