実行時のエラーについて
実行時のエラーについて
#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の値を入力する処理はできません。
#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:実行時のエラーについて
scanf()を実行した場合バッファの内部に改行文字'\n'が残ります。今回の場合aも残りますが。
このため二つ目の入力がうまく作用しません。
バッファをクリアすることができれば問題は解決すると思います。
このため二つ目の入力がうまく作用しません。
バッファをクリアすることができれば問題は解決すると思います。
Re:実行時のエラーについて
rewind(stdin);を、scanf(("%d",&a); の下に追加すれば動くようになりますが、rewind()が何をしているか調べた方がいいと思います。
Re:実行時のエラーについて
scanf(" %d",&b)として出来ないのは、バッファに残っているのが'\n'だけではなく今回は、'a'と'\n'が残っています。だから空白で読み飛ばすのが不可能だったんだと思います。違ってたらすみません
scanf("%*s%d",&b)
としたら動くと思いますが。
scanf("%*s%d",&b)
としたら動くと思いますが。
Re:実行時のエラーについて
すみません
scanf("%*s%d",&b)
では、aに正常な値が入ったときに失敗しました。
やはりバッファをクリアするのが一番だとおもいます。
scanf("%*s%d",&b)
では、aに正常な値が入ったときに失敗しました。
やはりバッファをクリアするのが一番だとおもいます。
Re:実行時のエラーについて
携帯から失礼します。
このプログラムだと、英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは。
と思いますがどうでしょうか?
このプログラムだと、英字を比較しても意味がないので、戻り値を調べてエラーを出した方がいいのでは。
と思いますがどうでしょうか?
Re:実行時のエラーについて
scanfの特性についてこちら
http://www9.plala.or.jp/sgwr-t/c/sec05.html
などを読むと少し解るかと思います。
関数がどういう性質を持っているのか参考文献を読むことも大事ですが、
自分で色々試して性能を理解することも大事です。
その方が関数に慣れるので、何にしてもプログラムを書いてみるのがとても重要ですね。
例えば返り値はどのように違うのか
文献を頼りにする事は確かに重要で、その方が確実ですが、あらゆる手段を知っていると、例えば文献が見つからなかったとか何か問題があった時にでも応用、対処できるでしょう。
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:実行時のエラーについて
ありがとうございます。
ちなみになんで\nやaが残ると処理をスルーしてしまうようになってしまうのでしょうか?
感覚的にはわかるのですが、自分でうまく説明ができません。。。
残ってしまった\nやaが次のscanfに入って、ただ消化する。
というような解釈でよいでしょうか?
ちなみになんで\nやaが残ると処理をスルーしてしまうようになってしまうのでしょうか?
感覚的にはわかるのですが、自分でうまく説明ができません。。。
残ってしまった\nやaが次のscanfに入って、ただ消化する。
というような解釈でよいでしょうか?