実行時のエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
熱海

実行時のエラーについて

#1

投稿記事 by 熱海 » 18年前

#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の値を入力する処理はできません。

miyaza

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

#2

投稿記事 by miyaza » 18年前

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

miyaza

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

#3

投稿記事 by miyaza » 18年前

すこし訂正ですが。
今回は'\n'が残ったことよりも'a'が残ったことが原因ですね。

大工

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

#4

投稿記事 by 大工 » 18年前

scanf(" %d",&b)とすればうまくいきますよ。詳しくは携帯からなんで後でPCから書き込みますね

熱海

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

#5

投稿記事 by 熱海 » 18年前

大変ありがとうございますm(__)m
全く分からなかったので本当に助かりました。

大工

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

#6

投稿記事 by 大工 » 18年前

あれ・・・^^;

僕のは違ってました・・

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

miyaza

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

#7

投稿記事 by miyaza » 18年前

rewind(stdin);を、scanf(("%d",&a); の下に追加すれば動くようになりますが、rewind()が何をしているか調べた方がいいと思います。

miyaza

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

#8

投稿記事 by miyaza » 18年前

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

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

miyaza

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

#9

投稿記事 by miyaza » 18年前

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

組木紙織

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

#10

投稿記事 by 組木紙織 » 18年前

携帯から失礼します。
このプログラムだと、英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは。
と思いますがどうでしょうか?

Justy

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

#11

投稿記事 by Justy » 18年前

英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは
 私もそう思います。

管理人

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

#12

投稿記事 by 管理人 » 18年前

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:実行時のエラーについて

#13

投稿記事 by 熱海 » 18年前

ありがとうございます。

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


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

管理人

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

#14

投稿記事 by 管理人 » 18年前

では
http://www13.ocn.ne.jp/~msactown/c_1.html
ここの14番などが参考になるかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る