2015-06-14 42 views
2

在編寫算術表達式簡化器時,我只是觀察到這種奇怪的行爲。重建是以下問題:scanf讀取加整數但不是減號,乘法或除法符號

#include <stdio.h> 

int main(void) 
{ 
    int n, i; 
    char s[200]; 

    for(i=0;i<2;i++){ 
     if(scanf("%d", &n) == 1) 
     { 
      printf("%d\n", n); 
     } else { 
      scanf("%s", s); 
      printf("%s\n", s); 
     } 
    } 
    return 0; 
} 

如果輸入5+10它讀取n5s10。但是,對於其他標誌,即5-10,其在5中的n-10s中是預期的輸出。

我的問題是:哪些C功能造成這種情況?檢查:gcc版本4.8.2和ideone。

編輯


的整數字符閱讀解決了焦炭的問題。謝謝你的時間。 :)

如果有人有興趣:http://ideone.com/rOPyQD

+0

查看[scanf](http://linux.die.net/man/3/scanf)手冊頁,特別是格式字符串解釋。 – Jens

+0

@Jens也許我不夠好找到我的答案。閱讀之前和現在。 :( – silentboy

+0

@ user3121023親愛的先生,這個程序只需要兩個輸入,要麼5 + 10或5-10。沒有理由沒有什麼會在s中掃描 – silentboy

回答

3

如果輸入爲5 + 10讀取5在n和10秒。但是,對於其他標誌,即5-10,它讀取n中的5和-10中的s,這是預期的輸出。

你錯了,你可以通過改變你的printf()聲明來確定,以便區分哪一個產生每個輸出。然後你會發現,你的程序讀取5n在循環的第一次迭代,然後閱讀或者10-10n,不s第二迭代。

發生這種情況是因爲%d字段描述符讀取一個可選的十進制整數。 「任選簽名」表示緊接在之前,或者 a -用於負數或者+用於正數。因此,可以通過%d字段掃描"+10""-10"

+0

道歉。 – silentboy

1

這裏既有正被在

if(scanf("%d", &n) == 1) 

讀出。在第一種情況下,當鍵入5 + 10,在第一次迭代5在n和在第二次迭代10讀取正被讀取在正。既然是積極的,+10和-10是一樣的,它打印10 printf語句

printf("%d\n", n); 

而且這裏要注意的是,你在printf的,而不是「%s」使用「%d」。帶有「%s」的printf語句在此處未被調用。

這也解釋了第二種情況。 -10正在讀入'n'並使用「%d」打印