C言語関係掲示板

過去ログ

No.459.scanf()の復改文字が残る についての疑問点

[戻る] [ホームページ]
No.3311

5−4.scanf()の注意事項(2)復改文字が残る についての疑問点
投稿者---ひよこ(2002/11/03 18:31:38)


過去ログを探して見ましたが、解決できませんでした。
(過去ログに掲載されておりましたら、申し訳ありません。。)
どなたかのご解答頂きたいのですが、どうぞ宜しくお願いします。


○演習 6-5-1【問1】の実行例を実行した場合、
下記変数を使用
char houhou; // 計算方法格納変数
int data1, data2, kekka = 0; // 整数値格納変数

houhou には '+'(char型)格納
data1 には \n12(int型)格納
data2 には \n22(int型)格納
kekka には \n34(int型)格納
という事になるのでしょうか?

○No364.scanf( )の改行文字についての例を実行した場合、
パソコン内部ではコメントに書いてあるように保存されるという解釈で宜しいのでしょうか?
int main(void)
{
int x, y, z;

printf("input x y z\n");
scanf("%d", &x);
scanf("%d", &y);
scanf("%d", &z);
printf("x = %d, y = %d, z = %d\n", x, y, z);

return 0;
}

このコードでは
10 20 30[return]でも // xには 10, yには 20, zには 30(int型)
10[return] // xには 10(int型)
20[return] // yには \n20(int型)
30[return] // zには \n30(int型)
でも同じように動作します。

※もしかして"%d"と指定した場合は、データを数字と認識するので改行(\n)は読み飛ばされるのでしょうか?
 そして"%c"と指定した場合は、改行は文字コードとして読み込まれてしまう?

No.3325

Re:5−4.scanf()の注意事項(2)復改文字が残る についての疑問点
投稿者---ともじ(2002/11/05 00:16:59)


こんばんは。

>○演習 6-5-1【問1】の実行例を実行した場合、
> 下記変数を使用
> char houhou; // 計算方法格納変数
> int data1, data2, kekka = 0; // 整数値格納変数
>
>houhou には '+'(char型)格納
>data1 には \n12(int型)格納
>data2 には \n22(int型)格納
>kekka には \n34(int型)格納
>という事になるのでしょうか?

いえ、data1とdata2は'\n'は読み飛ばされて
 houhou には '+'(char型)格納
 data1 には 12(int型)格納
 data2 には 22(int型)格納
となります。
kekkaは12+22で34(int型)が格納されます。

>○No364.scanf( )の改行文字についての例を実行した場合、
>パソコン内部ではコメントに書いてあるように保存されるという解釈で宜しいのでしょうか?
>int main(void)
>{
>int x, y, z;
>
>printf("input x y z\n");
>scanf("%d", &x);
>scanf("%d", &y);
>scanf("%d", &z);
>printf("x = %d, y = %d, z = %d\n", x, y, z);
>
>return 0;
>}
>
>このコードでは
>10 20 30[return]でも // xには 10, yには 20, zには 30(int型)
>10[return] // xには 10(int型)
>20[return] // yには \n20(int型)
>30[return] // zには \n30(int型)
>でも同じように動作します。

いえ、まとめて入力してもひとつずつenter区切りに入力しても
yは20、zは30が格納されます。このコメントはおそらく入力バッファ
の内容を書いたものだと思います。

>※もしかして"%d"と指定した場合は、データを数字と認識するので改行(\n)は読み飛ばされるのでしょうか?
> そして"%c"と指定した場合は、改行は文字コードとして読み込まれてしまう?

そういうことになります。


No.3328

Re:5−4.scanf()の注意事項(2)復改文字が残る についての疑問点
投稿者---ひよこ(2002/11/05 01:06:23)


ともじ先生、ご回答頂きありがとうございます。

すみません!コメントは私が勝手に書き込んだものです。
過去ログを参考にした所、同じ様な疑問点が沸いたもので!

まだ引っ掛かるのですが・・
どうもバッファにあるデータの、私のイメージが間違っているようなんです。。
No.364は
 ‘力バッファの中身はこのように(コメントにあるように)なっているのでしょうか?
  変数にもこのように(改行も)格納されている?
 △修譴箸癲◆崙匹瀏瑤个気譴襦瓮丱奪侫,砲盪弔辰討い覆ぁ廚箸い事なのでしょうか?
 はたまた、バッファには'\n'が残っている(いた)が、int型の変数に格納される際、
  フラッシュ(→表現?)されてバッファにも残っていないという事でしょうか?
  最終的には、'30'を入力後のバッファには'\n'が残っている。

多分、の解釈で良いのかと思うのですが、それで宜しいのでしょうか?

それとまた違う疑問点なのですが、'\n'はint型だと読み飛ばされるのに
char型だと読み込まれてしまうのはなぜなのでしょうか?

No.3337

Re:5−4.scanf()の注意事項(2)復改文字が残る についての疑問点
投稿者---ともじ(2002/11/05 17:33:43)


こんにちは。

>No.364は
> ‘力バッファの中身はこのように(コメントにあるように)なっているのでしょうか?

キーボードからの入力は入力バッファが満杯になるかenterキーが
押下されるまで入力バッファにためられます。
enterキー押下のタイミングでバッファからscanfに渡されるのですが、
このときに%c以外の書式指定では空白類文字は読み捨てられます。
改行文字も空白類文字に含まれるので読み捨てられます。
ただし、最後の\nは入力バッファに残されます。

キー入力    入力バッファ
10[return] => '1' '0' '\n'    => xに10代入
                  ('\n'はバッファに残す)
20[return] => '\n' '2' '0' '\n' => yに20を代入
                  (最初の'\n'は読み飛ばし最後の'\n'は残す)
30[return] => '\n' '3' '0' '\n' => zに30を代入
                  (最初の'\n'は読み飛ばし最後の'\n'は残す)

>  最終的には、'30'を入力後のバッファには'\n'が残っている。

はい、最終的に'\n'は残ります。

>それとまた違う疑問点なのですが、'\n'はint型だと読み飛ばされるのに
>char型だと読み込まれてしまうのはなぜなのでしょうか?

%c書式指定ということですよね。'\n'は文字ですから、文字を入力する
%cでは'\n'も処理するようになっています。


No.3343

疑問点は解決いたしました!
投稿者---ひよこ(2002/11/05 23:34:04)


大変ご丁寧な解説ありがとうございます。
今日はぐっすり眠れます。
学習する度、細かな疑問点が次々湧いてきます。
でも解決した時のすがすがしさはないですね!
この解説を頭に入れて、高度なPGをかけるようになりたいです。
ありがとうございました!!