2014-01-07 43 views
0

我正在研究這個程序,要求用戶輸入電路半徑,然後要求他們選擇他想要計算的:面積,周長,或汽缸容積..'計算電路的面積和周長'程序在c ...奇怪的輸出

#include <stdio.h> 

int main(void) 
{ 
float radius=0.0,height=0.0; 
char choice,quit; 
const float pi=3.1415658; 

do 
{ 
printf("Enter radius : \n"); 
scanf("%f",&radius); 

printf("\n\nWhat do you want to calc.?\nArea of circuit --> press A\n" 
"Circumference of circuit --> press C\nVolume of cylinder --> press V\nQuit --> Q\n"); 

scanf("%c",&choice); 

switch (choice) 
{ 
case 'A': 
    printf("Area = %.5f\n",radius*radius*pi); 
    break; 
case 'C': 
    printf("Circumference = %.5f\n",2*radius*pi); 
    break; 
case 'V': 
    printf("Enter Hight : \n"); 
    scanf("%f",&height); 
    printf("Volume of cylinder = %.5f\n",radius*radius*pi*height); 
    break; 
case 'Q': 
    quit='y'; 
    break; 
default: 
    printf("default!!\n"); 
    break; 
} 
}while(quit != 'y'); 

return 0; 
} 

但是當我運行該程序

 
Enter radius : 
3 

What do you want to calc.? 
Area of circuit --> press A 
Circumference of circuit --> press C 
Volume of cylinder --> press V 
Quit --> Q 
/*here before I choose anything the next line appears, skipping reading the choice*/ 
default!! 
Enter radius : 

那麼,爲什麼它跳過讀取用戶的選擇並直接跳轉到默認? 有什麼問題?

+0

,你需要初始化'quit'。 –

+0

調試此問題的正確方法是在調試器中逐步執行程序,在每個可疑步驟檢查相關值,或插入語句以在執行過程中打印值以顯示正在進行的操作。要求他人爲你調試是不合適的。 –

回答

3

這是因爲當您使用scanf來讀取半徑時,您按下的換行符結束該輸入仍然在輸入緩衝區中。所以當你以後使用scanf來讀取一個字符時,它會讀取換行符。

簡單的解決方案是告訴後者scanf跳過任何領先的空白。這是通過添加一個空格scanf格式代碼完成:除了錯誤的使用`scanf`

scanf(" %c", &choice); 
/* ^   */ 
/*  |   */ 
/* Note space here */ 
+0

你知道嗎,它工作,但我不明白爲什麼? 首先 - 我明白,「當您使用scanf讀取半徑時,您按下的結束輸入的換行符仍然在輸入緩衝區中」,但是這有什麼問題? 第二 - scanf讀取新行時出現什麼問題?我的意思是誰會影響整個程序 最後 - 你的意思是我們需要告訴後者scanf跳過「換行」字符嗎?如何通過向scanf格式代碼添加空間來實現這一點? 對不起 – Salahuddin

+0

@Salahuddin如果輸入緩衝區中的下一個字符是換行符,並且您想要讀取下一個字符,那麼您將得到該換行符和輸入讀取函數(在您的情況下爲'scanf'函數)將高興地回來。 –

+0

@Salahuddin另外,當你在'scanf'格式字符串中有一個空格時,它會告訴'scanf'跳過'isspace'函數返回true的所有字符,而換行符就是這樣一個空格字符。 –