2013-03-08 117 views
-1

我有一個簡單的C程序,它循環從用戶(它是一個CAS的種類)獲得無限數量的數字。我正在使用多種語言編寫程序,而C++版本完美工作時,C版本在循環結束時停滯,當程序要求另一個用戶操作時,要求用戶輸入兩次操作。這裏的程序應該如何工作:程序暫停在循環

輸入操作
4 + 2

+2 //用戶增加了2到以前的答案
+ x //用戶可以像這樣無限期地繼續添加

相反,這裏發生了什麼:

輸入操作
4 + 2
+2
//什麼也沒有發生,直到用戶輸入 「+2」 再次
+2
+ x
+ x
[總和8 + x]
等等。

我最初認爲這個暫停是由程序要求用戶輸入兩次引起的,一次是循環開始,然後是循環結束前。我在循環中放置了一個迭代計數器來確定程序應該得到什麼樣的輸入(&num1,&op,&num2&op,&num2)。出於某種原因,這沒有什麼區別。下面的代碼的相關部分:

int opnubmer; 
opnumber = 0; 

printf("Enter an operation\n"); 
    while(op != '=') 
    { 
     if (opnumber == 0) 
     { 
      scanf("%d%c%d",&num1,&op,&num2); 
     } 
     else if (opnumber != 0) 
     { 
      scanf("%s%d",&op,&num2); 
     } 
     switch(op) 
     { 
      case '+': 
       num2 += num1; 
       break; 

      case '-': 
       num2 -= num1; 
       break; 

      case '*': 
       num2 *= num1; 
       break; 

      case '/': 
       num2 /= num1; 
       break; 

      default: 
       printf("%s%c%s", "Unknown op: ", op, "\n"); 
       exit(1); 
     } 

     printf("Solution: "); 
     printf("%d",num2); 

     opnumber++; 
     num1=num2; 
    } 

誰能幫助我嗎?

+1

'scanf'對於未格式化輸入(來自用戶的輸入)使用「很困難」。它的意思是**格式化輸入**,因此其名稱中的** f **。我建議你用'fgets'閱讀用戶輸入,然後解析它。 – pmg 2013-03-08 16:24:03

回答

2

它看起來像你在第二個scanf電話打錯了,你用%s而不是%c來讀取op

此外,當使用scanf來讀取輸入時,必須非常小心空白。尾隨的空格(包括換行符)保留在輸入流中,因此下一次從輸入流中讀取時,空格將是第一個看到的東西。

而不是使用scanf,使用fgets一次讀入輸入一行到一個緩衝區,然後解析出你需要的緩衝區。例如。 :

char line[256]; 
fgets(line, sizeof(line), stdin); 
sscanf(line, "%d%c%d", &num1, &op, &num2); 
+0

有道理,但是我嘗試了一下,然後回到'Unknown op:',但沒有給出操作。 – Jules 2013-03-08 16:23:58

+0

@ user2129150使用scanf與%d代替%c – 2013-03-08 16:24:50

+2

,這是因爲'scanf'在輸入流上留下換行符。我會更新我的答案。 – 2013-03-08 16:25:07

0

它的行爲完全正常,當你沒有在第一次迭代,你正在尋找一個string,即使你有一個變化%c程序修復,預計僅字符和數量不是number character number序列。