1

getchar()が実際に何をするのかを理解したいとき、この小さな断片はloop私を混乱させました。

int i;
int c;
for (i = 0; i < 100; i++) {
    c = getchar();
    printf("%d\n", c);    
    printf("i is %d\n", i);
}

入力と出力は次のとおりです。

input: 1
output:
49
i is 0
10
i is 1

input: 12
output:
49
i is 2
50
i is 3
10
i is 4

以前に想定したように、1文字を入力すると、getchar()がそれを抽出し、putchar()がそれを出力し、プログラムは次のループに移動して次の入力を待ちます。しかし、結果は、コードが想定どおりに機能しないことを示しているようです。

  1. 出力数はどういう意味ですか?
  2. 余分なループ印刷が常にありますが10、これ10はどういう意味ですか?それが意味する場合、なぜループ内でEOF置き換えた後c = getchar();、コードは常に出力しますが、私が想定したように、最後のループでを出力する必要がありますか?c = (getchar() != EOF);10

とてもThx!

4

2 に答える 2

2

質問

出力数はどういう意味ですか?

出力番号は、通常はASCIIに基づく文字セットに従った文字の値を参照します(一部のメインフレームはEDCDICも使用します)。

C11(n1570)、§5.2.1文字セット

2つの文字セットとそれに関連する照合シーケンスを定義する必要があります。ソースファイルが書き込まれるセット(ソース文字セット)と、実行環境で解釈されるセット(実行文字セット)です。各セットはさらに、この節によって内容が指定される基本文字セットと、拡張文字と呼ばれる0個以上のロケール固有のメンバー(基本文字セットのメンバーではない)のセットに分割されます。結合されたセットは、拡張文字セットとも呼ばれます。実行文字セットのメンバーの値は、実装によって定義されます。

したがって、この文字エンコードでは、49が文字'1'で、50が文字'2'です。

質問

常に余分なループ印刷10がありますが、これはどういう意味ですか?

ASCII文字セットでは、10が改行文字 '\n'です。

'1'キーボードで文字を入力しているとき、入力を有効にするためにを押しているので、標準の入力ストリームstdinは実際には2つの文字:'1'とを受け取ります。'\n'<Enter>

したがって、呼び出しを行ったら、標準の入力ストリームをクリーンアップする必要がありますgetchar。それを達成するための1つの可能な方法は、改行文字に到達するまですべての文字を消費することですEOF

#include <stdio.h>

int c;

while ((c = getchar()) != '\n' && c != EOF)
  ;

BSDには関数もfpurgeあり、SolarisおよびGNU/Linuxでは__fpurge使用できます。

質問

それが意味する場合、なぜループ内でEOF置き換えた後c = getchar();、コードは常に出力しますが、私が想定したように、最後のループでを出力する必要がありますか?c = (getchar() != EOF);10

の値は負の値でなければならないEOFため、10にすることはできません。EOF

C11(n1570)、§7.21.1はじめに

EOF、これは、型と負の値を持つ整数定数式に展開されintます[...]。

于 2013-03-24T15:33:59.070 に答える
2

出力数はどういう意味ですか?

文字コードgetchar()を取得し、指定子を使用して印刷しているため、文字の文字コードが返さ%dれます。この場合、文字エンコードはASCIIまたはUTF-8のように見えるので1、49、50など2を表します。

2:[...引用するには長すぎます...]

10は、改行()のASCIIおよびUnicode文字コードです'\n'。Enterキーを押すと(getchar()待機します!)、 Enterキーを押した文字端末に送信されます。

于 2013-03-24T15:36:01.310 に答える