ページ 11

実行時のエラーについて

Posted: 2007年4月02日(月) 18:05
by 熱海
#include <stdio.h>
#include <stdlib.h>
int main(void){
int a,b;
printf("aの値を入力してください:");
scanf("%d",&a);
printf("bの値を入力してください:");
scanf("%d",&b);
if(a>b)
printf("a>b");
return 0;
}
int型の変数aとbを入力して大小を比較するプログラムです。
int型の変数aに'a'を代入すると暴走してしまい、実行結果が

aの値を入力してください:a
bの値を入力してください:

のようになります。
なぜ「bの値を入力してください:」まで出力されるのでしょうか?
bの値を入力する処理はできません。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 18:20
by miyaza
scanf()を実行した場合バッファの内部に改行文字'\n'が残ります。今回の場合aも残りますが。
このため二つ目の入力がうまく作用しません。
バッファをクリアすることができれば問題は解決すると思います。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 18:49
by miyaza
すこし訂正ですが。
今回は'\n'が残ったことよりも'a'が残ったことが原因ですね。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 20:09
by 大工
scanf(" %d",&b)とすればうまくいきますよ。詳しくは携帯からなんで後でPCから書き込みますね

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 20:13
by 熱海
大変ありがとうございますm(__)m
全く分からなかったので本当に助かりました。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 20:40
by 大工
あれ・・・^^;

僕のは違ってました・・

僕もきになるんで・・・・・誰かおねがいです

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 20:49
by miyaza
rewind(stdin);を、scanf(("%d",&a); の下に追加すれば動くようになりますが、rewind()が何をしているか調べた方がいいと思います。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 20:59
by miyaza
scanf(" %d",&b)として出来ないのは、バッファに残っているのが'\n'だけではなく今回は、'a'と'\n'が残っています。だから空白で読み飛ばすのが不可能だったんだと思います。違ってたらすみません

scanf("%*s%d",&b)
としたら動くと思いますが。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 21:01
by miyaza
すみません
scanf("%*s%d",&b)
では、aに正常な値が入ったときに失敗しました。
やはりバッファをクリアするのが一番だとおもいます。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 21:30
by 組木紙織
携帯から失礼します。
このプログラムだと、英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは。
と思いますがどうでしょうか?

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 21:32
by Justy
英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは
 私もそう思います。

Re:実行時のエラーについて

Posted: 2007年4月02日(月) 22:01
by 管理人
scanfの特性についてこちら
http://www9.plala.or.jp/sgwr-t/c/sec05.html
などを読むと少し解るかと思います。

関数がどういう性質を持っているのか参考文献を読むことも大事ですが、
自分で色々試して性能を理解することも大事です。
その方が関数に慣れるので、何にしてもプログラムを書いてみるのがとても重要ですね。
例えば返り値はどのように違うのか
#include <stdio.h>

int main(){
	int a;
	printf("今の入力では%dが返って来ました。\n", scanf("%d",&a));
	return 0;
}
こんなプログラムで試してみる事も出来ます。
文献を頼りにする事は確かに重要で、その方が確実ですが、あらゆる手段を知っていると、例えば文献が見つからなかったとか何か問題があった時にでも応用、対処できるでしょう。

Re:実行時のエラーについて

Posted: 2007年4月03日(火) 01:22
by 熱海
ありがとうございます。

ちなみになんで\nやaが残ると処理をスルーしてしまうようになってしまうのでしょうか?
感覚的にはわかるのですが、自分でうまく説明ができません。。。


残ってしまった\nやaが次のscanfに入って、ただ消化する。
というような解釈でよいでしょうか?

Re:実行時のエラーについて

Posted: 2007年4月03日(火) 07:41
by 管理人
では
http://www13.ocn.ne.jp/~msactown/c_1.html
ここの14番などが参考になるかもしれません。