ページ 11

動作が停止してしまいます。

Posted: 2009年11月12日(木) 22:24
by まりも
いつもお世話になっています。

scanf関数とキャストを使用して、消費税を計算した金額を表示させる、という
プログラムを組んでいます。

コンパイルが通り、いざ数値を入力すると
Microsoft Windows の警告画面が出てきて
「a.exe は動作が停止しました。プログラムを終了します。」
と、実行できなくなります。

 問題の解決策として既知のコンピュータウィルスの可能性有との事だったので、
 現在使っているウイルスソフトの更新をしてみましたが、問題が解決しません。

コンパイルエラーは出なかったのですが、ソースコードに何か問題があったのでしょうか?

 C言語の理解がまだまだ足りず、初歩的な間違いの可能性も大です。
 良かったら、教えてください。;;

 エラーが出るタイミングは 数値(100)を入力し、コンソール画面に100と出た直後です。

  ■使用しているOS■
Windows Vista Home Basic
Intel(R) Core(TM) 2duo CPU E7200 @ 2.53GHz
2.00GB RAM 32ビット オペレーティングシステム

■コンパイラ : gcc
■エディタ  : メモ帳(notepad)

******ソースコード******
金額を入力して、消費税込の代金を計算、表示させるプログラム
#include <stdio.h>
  int main(void)
 {
	int data ;          // 金額
	scanf("%d\n",data) ;         //  金額の入力

	data = (int)(data * 1.05) ; // キャストを使用して、消費税の計算
	printf("%d",data) ;       //  代金の表示
	
	return 0 ;
 }

Re:動作が停止してしまいます。

Posted: 2009年11月12日(木) 22:31
by ドラ
まあ、よくある間違いです。

scanf("%d\n", &data) ;

また"%d"の方が良いと思います。

Re:動作が停止してしまいます。

Posted: 2009年11月12日(木) 22:47
by まりも
ドラさん

ありがとうございます。
・・・・・ホントに初歩のミスで、情けない・・・。

"&"をちゃんと付けて訂正したあと、100と入力しても何にも表示されず
???と思いながらもう一回 100 と入力したら 105 で 表示されました。

次に"\n"は無いほうがいいとの事だったので、削除して上書き後、実行したら
素直に 105 と 一発表示。
 "\n" は改行の意味(念のため)で使ったのですが、良くなかったみたいです。
どうしてなんでしょう?

Re:動作が停止してしまいます。

Posted: 2009年11月12日(木) 23:32
by ドラ
scanf系の書式指定文字列の中にでは%d等の変換仕様以外の文字は、その文字が続く限り
読み飛ばせという意味になります。
('\n'は改行文字ですが' 'や'\t'と一緒に空白類文字として同じ扱いを受けます)

"%d\n" となっていると10進法で数値を読み取った後、空白類文字が続く限り入力を読み飛ばします。
空白類文字以外の文字が入力された時点でやっとscanf()の処理が終わるという事になるのです。

だから、このような実行結果になります。
>"&"をちゃんと付けて訂正したあと、100と入力しても何にも表示されず
>???と思いながらもう一回 100 と入力したら 105 で 表示されました。

Re:動作が停止してしまいます。

Posted: 2009年11月13日(金) 06:58
by まりも
ドラさん

質問に詳しく答えてくれてありがとうございます。
すごくよくわかりました。

今回はコンパイルエラーにはならず、実行途中で動作が強制終了するという初めての体験をしました。
(コンピュータウイルスに感染した事も無いので、感染したのかと本気で慌てましたw)

scanf関数は入力時に規定以外の入力(文字とか)があると、
思わぬ動作をしてしまう、課題の多い関数だと後で説明がありました。

例えば心理テストのような、入力したデータを処理して更に分岐させて・・・
というようなプログラムを作りたいと思っているのですが、
まだまだ、うまくいきません。(多分初歩的な理解不足で^^;)

gets関数やatoi関数を組み合わせたらできそうかなぁ?と思ったので、
scan関数と比較しながら、試していきたいと思っています。

いつも教えてもらってばかりで、すみません。

ありがとうございました。

Re:動作が停止してしまいます。

Posted: 2009年11月13日(金) 06:59
by まりも
解決マーク入れるの忘れてしまいました。

どうもありがとうございました。