2017-09-17 7 views
1

)ステップバイとか、私はその実行方法を理解するために徹底的に十分な;だから、私はこのコードの一部を持っていることを言う:この質問は尋ねられていますが、説明されていないことを認識しています(「ch = getchar()」!= ' n' && c!= EOF;「

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

は(getchar関数をい)CH変数第一に単一の文字を読み、そして作ります比較、すなわち、ch != '\n' && ch != EOF、改行エスケープシーケンスをバッファに入れたままにしておきますが、実際にはch変数には入れませんか?そうであれば、改行エスケープシーケンス/ EOFを見つけるまで無限ループするでしょうか?改行エスケープシーケンスに遭遇しました。それはch変数に格納されていますか?そして私はいけない、どう?

+0

スタートし、あなたの方法を考え出す:

修正がintとしてchを宣言することです。ストリームを消費する 'getchar()'コールのby-definitionから 'ch'への代入は、" newlineエスケープシーケンスをバッファに入れたままにしておきますが、実際にはch変数にはありません "という理論全体を押しつぶす。 – WhozCraig

+3

コードが壊れています。 'getchar'は、理由のために' int'( 'char'ではなく)を返します。 – melpomene

+0

"改行のエスケープシーケンス"とは何を意味するのか分かりません。 '\ n'(バックスラッシュ-n)のようなエスケープシーケンスは、Cのソースコードの特徴です。実行時にデータに存在するものではありません。 – melpomene

答えて

7
char ch; 

まず、タイプcharch変数を定義します。

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

これはループです。whileです。ループ条件は(ch = getchar()) != '\n' && ch != EOFで、ループ本体は;(ヌルステートメント)です。

ループ条件は、&&(論理 "と")と2つのオペランド(ch = getchar()) != '\n'ch != EOFで構成されます。 &&演算子は、常にその左のオペランドを最初に評価します。

(ch = getchar()) != '\n'は、不等式比較です。右側は'\n'(改行文字を表します)です。左側は代入式ch = getchar()です。

getchar()は、stdin(標準入力)から文字を読み取るgetchar関数を呼び出します。成功した場合、この文字はunsigned char(通常は0〜255の範囲)の形式で返されます。それ以外の場合(getcharが失敗した場合)、EOF(これは(実装固有の)負の値です)を返します。これは、戻りタイプがgetcharである理由です。intです。すべての有効な文字値をエラーインジケータで表す必要があります。

この値はchに格納されます。

  1. charはあなたの実装でunsigned型である。この時点では、2つの可能性があります。この場合、正常に読み込まれた文字はそのまま格納されますが、EOFは通常の文字にマップされます。 (いつものように)EOFの値が-1の場合、最終的にUCHAR_MAX(通常は255)になります。

  2. charは実装の署名付きタイプです。この場合、可能なすべての文字値の半分が範囲外です(通常、符号付きcharは-128 .. 127の範囲を持ち、128 .. 255の値を格納できません)。ここでは物事は少しぼやけてしまいます。範囲外の文字は、(実装定義の)シグナルか、他の(実装定義の)文字に変換されます。一方、EOFはそのままで保存されます(値がCHAR_MINより小さい場合を除き、実装定義のシグナルや変換を得ることができます)。

代入式は、代入後の左オペランドの値を持ちます。したがって、(ch = getchar())は、chという新しい値を返します(これは、上記のようにマングルされた入力文字です)。この文字を'\n'(改行)と比較します。改行であれば、!=はfalseを返します。&&は直ちにfalseを返し、ループが停止します。 (、あなたの実装に応じて、他の文字あるいはEOFがあるため、上記のマングリングの'\n'として誤検出される可能性がありますので注意してください。)

を入力文字はその右を評価するための改行、!=利回り真と&&進行されていない場合ハンドオペランド。ここでは、ch != EOFを比較します。 #1の場合(charは符号なしタイプ)、EOFが負の値であるため、この比較は常に真です(よりエキゾチックな状況でない限り、char/intは同じサイズ/範囲の値をとります)私はそこに入るつもりはない)。ケース2の場合(charが符号付きタイプの場合)、この比較はgetcharEOFと返された場合(つまり、入力の最後に達したかエラーが発生した場合)、falseを返し、ループが停止します。特定の文字(通常はUCHAR_MAX,255)をEOFとして誤って識別することもあります。そうでない場合(すなわち、ch'\n'またはでない場合)、ループが繰り返され、次の文字が読み取られて調べられます。

このコードの目的は、改行または入力の終わりに達するまで入力を消費して破棄することです。

しかし、理由コードが書かれている方法の

は、(入力の終わりに達したときに永遠ので、ループ)、それは実際にはどちらか EOFを認識しませんか EOFとして有効な入力を処理する(したがって、早期終了します)。最も内側の括弧で

int ch; 
関連する問題