2016-10-10 21 views
-1

改行が発生するまで文字を読み込むための関数をCに書きたいと思っていました。 scanf関数を使用してC:scanfとgetcharの動作の相違点

コード:GETCHARを使用して while(scanf("%c",&x)!=EOF&&x!='\n'){....}

コード:while(((x=getchar())!=EOF)&&x!='\n'){....}

のint xは関数内で宣言されたローカル変数である私は、scanf関数とGETCHARを使用して、次のコードを書きました。 2番目のコードはword(EG: "ADAM \ n")を読み取った後に停止し、scanfコードはループを中断せずに待機し続けます。

その後、scanfの後に、xの値は(2^7-1)*(2^8)+文字読み込みのアスキー値(改行では32522)でしたが、文字定数 '\ n'は10でした。だから比較は失敗していた。

私の質問は、getcharが値10(文字定数 '\ n'と一致する)を割り当てている間に、 '\ n'を読んだ後でxに32000を超える値を割り当てる理由です。

+1

'scanf("%c "、&x)== EOF'は深刻ですか? –

+0

申し訳ありません。それは間違いだった。私はその行を修正しました@SouravGhosh – user3763284

+0

は何で修正されましたか? scanf()の戻り値は重要です。 –

答えて

0

ここでの重要な違いはscanf行動である:

1)scanf一般的には、例えばscanf("%d",&num)ための異なるデータ型を(だけではなくchar)、読み取るために使用される整数番号を読み取って、すべての「空間」の文字を無視します( '(スペース)'、 '\ t'(タブ)、 '\ n'(改行)などの文字)。

2)scanf("%c",&x)scanf("%d",&num)(数値を入力した場合)は、stdinから正常に読み取られたデータの1を返します。注:番号がstdinでない場合、scanf("%d",&num)0を返します。

0

主な違いは、入力ストリームの空白文字をscanfがスキップし、getcharがそれらを返す点です。ですから、scanfで入力に改行を見ることはできません。また、scanfの戻り値は成功した変換された変数の数です。

変数に有効な値(more details here)が含まれている場合は、scanf(...) == 1を確認する必要があります。 scanfがすべての入力変数を変換しなかった場合、変換されていない変数の値は未定義です。これが、あなたのケースではxの奇妙な値を見る理由です。これはコンパイラが以前に使用されていたメモリ位置にxを代入していて、残りのデータがまだ残っているという事実によって(多かれ少なかれ)ランダムな値です。

関連する問題