3

K&R の練習をしていると、非常に興味深い質問が見つかりました。

次のようにコードします。


include <stdio.h>
main()                                                                                              
{                                                                                                   
    int c;
    int bn;
    bn=0;
    while((c=getchar())!=EOF)                                                                       
    {                                                                                               
        if(c==' ')                                                                                  
        bn++;                                                                                   
    }                                                                                           
    printf("blanks counter:%d\n",bn);                                                               
} 

コード関数は統計的空白の数です

一度にすべての単語を入力します。バックスペース キーは使用しません。完了です。


$ ./a.out

I have a dream

blanks counter:3

しかし、バックスペースキーを使用すると、入力プロセスで何が起こる可能性がありますか?

空白キーが押されたときに getchar() 関数がこのイベントを取得し、 bn++ を実行する必要があると推測しているため、後でバックスペースキーを押してこの空白を削除しても、 bn 変数の値は変更されません。しかし、練習の結果は私の推測とは異なります。練習のプログラムは次のとおりです。

最初のステップ:最初の空白を入力 ここに画像の説明を入力

2 番目のステップ: バックスペース キーを使用して空白を削除 しますここに画像の説明を入力 3 番目のステップ: 残りの文字入力を終了します ここに画像の説明を入力

なぜ結果は 4 ではなく 3 なのですか? なぜ bn 変数の値は、バックスペース キーを押すと変更されるのですか?

私にいくつかのアイデアをください、ありがとう!

4

1 に答える 1

12

あなたのコンソールはラインバッファリング標準入力です。これは、 を押すまでプログラムが入力を受け取らず、実際のキーストロークのシーケンスではなく、編集されReturnたテキストを受け取ることを意味します。

于 2012-11-12T09:33:09.000 に答える