2017-02-18 99 views
0

這是一個菜單驅動的程序,要求用戶選擇。 爲什麼如果條件不執行? 輸出已連接。 創建程序要求用戶的輸入:爲什麼if條件沒有被執行?

void main() 
{ 
    float a,b,ans=0;char ch,choice; 


    choice='y'; 

    while(choice=='Y'||choice=='y') 
    { 


     printf("Enter two numbers \n"); 
     scanf("%f %f",&a,&b); 
     printf("1.+for Addition\n"); 
     printf("2.-for subtraction \n"); 
     printf("3.*for multiplication \n "); 
     printf("4./for Division \n"); 
     printf("Enter your choice of operation \n"); 
     scanf("%c",&ch); 

     if(ch=='+') 
      ans=a+b; 
     else if (ch=='-') 
      ans=a-b; 
     else if(ch=='*') 
      ans=a*b; 
     else if(ch=='/') 
      ans=a/b; 
     else 
     { 
      printf("wrong choice entered\n"); 
     } 
     printf("Answer is %f \n",ans); 
     printf("Do you want to coninue (Y/N)\n"); 
     scanf("%c",&choice); 
    } 

    printf("program Terminated\n"); 
} 

輸出:

/* Enter two numbers 
    1010 
    22 
    1.+for Addition 
    2.-for subtraction 
    3.*for multiplication 
    4./for Division 
    Enter your choice of operation 
    wrong choice entered 
    Answer is 0.000000 
    Do you want to coninue (Y/N) 
    n 
    program Terminated 
*/ 

以上是對輸出屏幕。 它不執行操作。

回答

1

當輸入第一2號,它們被放置到變量a和b。但是在輸入這兩個數字之後,你按下了輸入。計算機將它視爲新輸入,並將其置於需要輸入的第一個下一個適當變量中。在這種情況下,它是您的變量ch,而不是+, - 。/或*,ch的值爲「新行」。如果您嘗試將標準輸出的ch值寫入整數,則它會寫入數字10.它是新行的ASCII字符。輸入前兩個數字後,只需加上getchar()即可收集新的線路符號,您的下一個scanf將正常工作。

順便說一句,您與上次輸入scanf("%c",&choice);有同樣的問題,因爲按上一次操作決定後輸入,也會導致程序無法正常工作。對這部分做同樣的事情,或者乾脆在%c之前留下空白字符。

1

請嘗試以下

scanf(" %c",&ch); 
     ^^ 

scanf(" %c",&ch); 
     ^^ 

否則,下一個字符被讀取,可以是一個空白字符。

考慮到的是,根據不帶參數的C標準功能主要應宣佈像

int main(void) 
0

scanf()不會消耗尾隨換行符。跳過的scanf()接收用戶輸入的上一行中的換行符,並終止而不會收到更多的輸入,如您所期望的那樣...

scanf()對於換行符有點麻煩。一個可能的解決方案是使用fgets()從控制檯獲取一行,然後使用sscanf()來解析接收到的字符串。

另一個更有針對性的解決方案是在最後一次scanf()調用的格式字符串中使用「%c」。 %c格式說明符本身並不佔用前導空白,這就是爲什麼它會得到剩餘的換行符,而不是由用戶鍵入的字符。