2013-09-21 139 views
0

我試圖寫我的第一個計算器,並發現了一些在線的例子,然後我改變,使他們更容易在流動的條款。然而,當我改變這個流程:簡單的計算器()

#include <stdio.h> 

main() 
{ 
    char operator; 
    float num1,num2; 

    printf("Enter an operator (+, -, *, /): "); 
    scanf("%c" ,&operator); 
    printf("Enter first operand: "); 
    scanf("%f" ,&num1); 
    printf("Enter second operand: "); 
    scanf("%f" ,&num2); 

    switch(operator) 
    { 
     case '+': 
      printf("num1+num2=%.2f\n" ,num1+num2); 
      break; 
     case '-': 
      printf("num1-num2=%.2f\n" ,num1-num2); 
      break; 
     case '*': 
      printf("num1*num2=%.2f\n" ,num1*num2); 
      break; 
     case '/': 
      printf("num1/num2=%.2f\n" ,num1/num2); 
      break; 
     default: //of operator is other than +, -, *, /, erros message shown 
     printf("Error! Invalid operator, this is basic math only.\n"); 
    }  
    return 0; 
} 

這樣:

#include <stdio.h> 

main() 
{ 
    char operator; 
    float num1,num2; 


    printf("Enter first operand: "); 
    scanf("%f" ,&num1); 
    printf("Enter an operator (+, -, *, /): "); 
    scanf("%c" ,&operator); 
    printf("Enter second operand: "); 
    scanf("%f" ,&num2); 

    switch(operator) 
    { 
     case '+': 
      printf("num1+num2=%.2f\n" ,num1+num2); 
      break; 
     case '-': 
      printf("num1-num2=%.2f\n" ,num1-num2); 
      break; 
     case '*': 
      printf("num1*num2=%.2f\n" ,num1*num2); 
      break; 
     case '/': 
      printf("num1/num2=%.2f\n" ,num1/num2); 
      break; 
     default: //of operator is other than +, -, *, /, erros message shown 
     printf("Error! Invalid operator, this is basic math only.\n"); 
    }  
    return 0; 
} 

根本改變流從:進入運營商,然後輸入第一個數字,然後第二個數字。要:輸入第一個號碼,然後輸入運營商,然後輸入第二個號碼。 我的問題是,當我這樣做時,我看到了Enter運算符,但程序跳過了輸入運算符的選項並要求輸入第一個數字,然後輸入第二個數字。響應是默認開關。

+0

你看過[這個](http://stackoverflow.com/questions/14484431/scanf-getting-skipped?rq=1)的問題嗎? – charmlessCoin

回答

0

您輸入的換行符scanf讀入您的第一個操作員正在採取的第二個scanf調用。有關更詳細的解釋,請參見this問題。

總之,寫這樣的功能,每一個scanf調用後調用它。

void clear_stdin(void) 
{ 
    while(getchar() != '\n'); 
} 
0

是因爲換行符留在緩衝區內,當你進入第一個scanf的輸入,所以下面scanf接受它,因爲它的輸入,只放了getchar()scanf()之後會解決它

0

輸入緩衝區中留有新行。

使用scanf("%f",...時,%f消耗前導空白,但在數字後面沒有尾隨空白 - 通常是\n

當使用scanf("%c",...,該%c確實消耗領先的空白,並char之後沒有尾隨的空格要麼。

爲了消耗剩餘的空白空間(例如來自先前的scanf()\n),簡單地在%c之前加上一個空格。

// scanf("%c" ,&operator); 
scanf(" %c" ,&operator); // add space. 
+0

你是對的這個工作。這種現象的原因是什麼?這是c語言中的一箇舊bug嗎?還是有目的地完成了這個任務並且有一個原因? –

+0

假設「這是一個老bug」中的「this」是指'%c'消耗空白:它不是一個錯誤。 '%c'掃描1'char',_any_ 1'char',沒有例外,包括''''''\ n''等,甚至是''\ 0''(在閱讀文本時很少遇到。 )爲了避免在空格中掃描,預處理''''在'%c'之前消耗所有的空白。因此''%c「'不會存儲空格。 '%c'允許使用'scanf()'掃描一個空格字符。 – chux