2015-09-18 39 views
2

我使用開關case語句寫了一個程序,並要求輸入一個字符,但它不要求在控制檯窗口中的字符,但跳過它完全Scanf未掃描%c字符,但跳過了語句,爲什麼?

int main() 
{ 
    float a, b, ans; 
    char opr; 

    printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n"); 
    scanf(" %f %f",&a,&b); 


    printf("\nGIVE THE REQUIRED OPERATOR\n"); 

    //no display(echo) on the screen 
    //opr = getch(); 
    //displays on the screen 
    //opr = getche(); 

    scanf("%c",&opr); 

    switch(opr) 
    { 
     case '+' : 
      ans = a+b; 
      printf("%f", ans); 
      break;   
     case '-' : 
      ans = a-b; 
      printf("%f", ans); 
      break;   
     case '*' : 
      ans = a*b; 
      printf("%f", ans); 
      break;   
     case '/' : 
      ans = a/b; 
      printf("%f", ans); 
      break; 
     case '%' : 
      ans = (int)a % (int)b; 
      printf("%f", ans); 
      break; 
     default : 
      printf("\nGIVE A VALID OPRATOR\n"); 

    } 

    system("pause");   
    return 0; 

,但是當我在把空間%c前第二scanf它的工作原理有人告訴一些關於一個空白,我發現混亂

他說,第二scanf正在採取的\n值作爲一個字符,如果我在第二scanf加一個空格%c之前是不是一個性格,而不是ta作爲角色的空間?

但是這個計劃不採取\n作爲字符

int main() 
{ 
    char a; 
    printf("\ngive a char\n"); 
    scanf("%c",&a); 
    printf("%c",a); 

    return 0; 
} 

這真是混亂可以在任何幫助我,我想了解什麼是錯的。

+0

這可能是在插入兩個數字後輸入的'換行'字符。輸入像緩衝隊列一樣工作。它排列字符。在這種情況下,你告訴它將第一個數字讀入&a,跳過其間的任何內容,將第二個數字讀入&b,然後讀取下一個字符。自從輸入數字到&b後,即時猜測你點擊'ENTER',所以它會將'換行'讀入&opr。解決這個問題的一個快速方法是在你的scanf操作行後面添加另一行'scanf(「%c」,&opr);') – TuanDT

+2

在第二個'scanf'的'%c'之前放置一個空格https:// stackoverflow .com/questions/13275417/why-scanfd-does-not-consume -n-while-scanfc-does – kaylum

+1

不要使用'scanf'。http://www.c-faq.com/stdio/scanfprobs。HTML – jamesdlin

回答

3

每次使用的scanf這種格式時間:

scanf("%c",&a); 

離開,這將在未來的迭代中消耗一個換行符。 您提到的最後一個程序只有一個「scanf」。嘗試使用另一個scanf。你會得到同樣的問題。

這樣可以避免你必須寫空格:

scanf(" %c",&opr); 

空間格式字符串告訴scanf函數忽略空格之前。或它更好地使用

getchar(); 

將scanf函數之前消耗所有的換行符

+0

感謝偉大的解釋,是什麼getche()和getchar函數() –

+0

如果你真的想清除您的概念請點擊此鏈接之間的區別:http://www.c-lang.thiyagaraaj.com/archive/c-blog/使用getch-getche-and-getchar-in-c – secretgenes

+0

我真的會這樣做,但它不允許我剛剛來到網站,就像在提問之前的幾分鐘,它說你必須有聲望15東西 –

1

的問題是,你要離開未被消耗的數字後進入\n,然後由第二scanf()讀取。 如果您檢查opr中的值,您會看到它是'\ n'。

-2

嘗試增加fflush(標準輸入)。

+1

'fflush(stdin)'會導致未定義的行爲,因爲'stdin'是一個輸入流。 – MikeCAT