2012-02-10 136 views
1

我寫了這段簡單的代碼(它實際上是根據s,c或t計算x的正弦,餘弦或正切值作爲輸入),它工作正常,直到我試圖改變語句的順序爲止。 。這一個正常工作.....編譯時編譯器跳過語句?

#include<stdio.h> 
#include<math.h> 
void main() 
{ 
char T; 
float x; 
printf("\nPress s or S for sin(x); c or C for cos(x); t or T for tan(x)\n\n"); 
scanf("%c", &T); 
printf("Enter the value of x: "); 
scanf("%f",&x); 

if(T=='s'||T=='S') 
{ 
    printf("sin(x) = %f", sin(x)); 
} 
else if(T=='c'||T=='C') 
{ 
    printf("cos(x) = %f", cos(x)); 
} 
else if(T=='t'||T=='T') 
{ 
    printf("tan(x) = %f", tan(x)); 
} 
} 

* *只要我改變安排如下編譯器詢問x的值,並跳過scanf函數對焦炭T和沒有返回值...任何人都可以解釋這裏發生了什麼?

#include<stdio.h> 
#include<math.h> 
void main() 
{ 
char T; 
float x; 

printf("Enter the value of x: "); 
scanf("%f",&x); 
printf("\nPress s or S for sin(x); c or C for cos(x); t or T for tan(x)\n\n"); 
scanf("%c", &T); 
if(T=='s'||T=='S') 
{ 
    printf("sin(x) = %f", sin(x)); 
} 
else if(T=='c'||T=='C') 
{ 
    printf("cos(x) = %f", cos(x)); 
} 
else if(T=='t'||T=='T') 
{ 
    printf("tan(x) = %f", tan(x)); 
} 
} 
+0

'無效的主要()'是不是入口點的正確簽名。你正在尋找'int main(void)'。 – 2012-02-10 17:58:38

+0

但前一個運行良好......? – bluedroid 2012-02-10 18:01:41

+0

即使使用int main()它也會跳過第二個scanf ... – bluedroid 2012-02-10 18:04:35

回答

5

這是因爲scanf%c接受一個字符 - 任何字符,包括'\n'。當你在輸入你的浮點值後點擊「返回」按鈕時,I/O系統給你浮動,並緩衝「返回」字符。當您撥打scanf%c時,角色已經在那裏,所以它馬上給你。

爲了解決這個問題,創建一個字符串緩衝區,調用scanf%s,並使用字符串的第一個字符爲您選擇的性格,就像這樣:

char buf[32]; 
printf("\nPress s or S for sin(x); c or C for cos(x); t or T for tan(x)\n\n"); 
scanf("%30s", buf); 
T = buf[0];