2014-11-04 107 views
-2

我有問題,這樣的代碼:C編譯器會忽略scanf函數

printf("Select your math: \n'+'addition \n'-'subtraction \n'*'multiplication \n'/' division \n"); 
char do_math; 
scanf("%c", &do_math); 
printf("Type 1 st number: "); 

問題是,程序不等到我鍵入「do_math」,但它顯示爲「1型ST號:」第一個printf之後。有任何想法嗎?

+0

你檢查,看看發生了什麼,以'do_math'? – 2014-11-04 20:56:39

+0

是的,它只是忽略它。 – Xenix 2014-11-04 20:58:59

+0

編譯器不會忽略'scanf'。您可以查看生成的彙編代碼(例如,使用'gcc -Wall -fverbose-asm -O -S')。你會發現'scanf'仍然在那裏被引用。你只是使用'scanf' *錯誤* – 2014-11-04 21:01:52

回答

3

如果你故意將scanf()定義爲不做任何事情的宏,編譯器將會編譯錯誤的唯一方法。不要責怪你的編譯器!

程序中可能會有一個以前的scanf()調用,在輸入緩衝區中留下回車符。您可以通過打印do_math的值來確認該假設。

嘗試scanf(" %c", &do_math);(在%c之前的空格)丟棄這樣的空格。

(這也是要注意從scanf()的返回值是個好主意。)

+0

謝謝,你是對的! – Xenix 2014-11-04 21:02:04

+0

您可以將答案標記爲已接受,而不是「感謝您」的評論? – 2014-11-04 21:05:23