2017-08-27 50 views
3

每次輸入正確的字符輸入時都會執行默認語句。我錯過了什麼?C程序。切換大小寫/用戶輸入。默認繼續執行

我的輸出:

My Outputs

正確的輸出:

Correct Outputs

#include <stdio.h> 

void main() { 
    char ch = '?'; 
    float f; 
    double a = 10.00, b = 20.00; 
    int i; 
    for (i = 0; i < 10; i++) { 
     scanf("%c", &ch); 

     switch (ch) { 
      case '+': 
      f = a + b; 
      printf("f = %.0f\n", f); 
      break; 

      case '-': 
      f = a - b; 
      printf("f = %.0f\n", f); 
      break; 

      case '*': 
      f = a * b; 
      printf("f = %.0f\n", f); 
      break; 

      case '/': 
      f = a/b; 
      printf("f = %.2f\n", f); 
      break; 

      default: 
      printf("invalid operator\n"); 
     } 
    } 
    return 0; 
} 

回答

2

隨着scanf,你打一個鍵,那麼你需要點擊 「進入」 之後。這會在輸入流中插入兩個字符 - 您按下的字符,以及換行符\n(可能還有\r,回車符)。

出於演示,如果輸入「一進」,則輸入流的樣子

a\n 

如果輸入「ABCD輸入」,然後輸入流的樣子:

abcd\n 

的您的循環的第一次迭代將讀取您輸入的字符,下一個將讀取換行符(這不是您的case中的那些字符,因此命中了default語句)

要閱讀沒有換行符的單個字符,請考慮getchar,或者只是兩個額外的case s,它們會使換行符和回車符在任何情況下都不起作用(但要記住這會「偷走」一些有用的迭代你的循環)。

0

您必須使用scanf(" %c", &ch);來消除所有空白,當使用%s強硬時,您不需要空間。

5

scanf()函數在嘗試解析除字符之外的其他東西之前自動刪除空格。

字符格式(%c,%[…],%n)是例外,它們不會刪除空格。

你的情況,你要跳過前導白間距,這樣做改變

scanf("%c", &ch); 

scanf(" %c", &ch); 
    ^   Note the space 
-2

變化

scanf("%c", &ch);

ch=getche();

然後,它會正常工作,您將不必在每次輸入後按Enter鍵。

0

scanf("%c", &ch);聲明要求您按Enter鍵。這會在輸入流中插入newline \n字符。在迭代過程中,當從輸入流中讀取\ n字符時,默認開關事件被執行。

由於只有一個字符正在讀取,因此您可以考慮使用getchar來避免這種情況。或者,您可以在一行中輸入字符串,然後按回車鍵,例如:+++---***+或者您可以添加另一個開關盒來處理換行符。