2012-08-10 25 views
-3
#include <stdio.h> 

int main(){ 
    int l,m,q,j; 
    char option; 
    scanf("%d",&q); 
    printf("%d\n",q); 
    for(j=0;j<q;j++){ 
     scanf("%c %d %d",&option,&l,&m); 
     printf("%c %d %d",option,l,m); 
    } 
    return 0; 
} 

輸出:輸出錯誤的下面的C代碼

3(Input) 
3 
C 1 4(Input) 

0 -374066224C 1 4 

什麼是錯的,上面的代碼?它沒有給出預期的輸出。

+0

你是什麼*預期*輸出? – Levon 2012-08-10 13:17:09

+0

**是預期產出?你嘗試調試它嗎?似乎謊言與家庭作業有關的問題... – 2012-08-10 13:17:13

+0

@Levon它不是一個家庭作業,我嘗試使用GDB調試,但沒有用。預期的輸出應該與輸入 – 2012-08-10 13:19:23

回答

9

還有輸入流中的換行字符從初始scanf()(以及後續scanf() S):這將被分配到optionC不是int,意味着lm是隨後int分配將失敗未初始化int變量。

要跳過它for環內的前導空格字符添加到scanf()的格式說明:

scanf(" %c %d %d",&option,&l,&m); 
    /*^*/ 

scanf()返回值是由成功的任務數量:檢查,以確保3分配製成。

if (3 == scanf(" %c %d %d",&option,&l,&m)) 
{ 
    /* Valid input. */ 
} 
+0

相同,這解決了這個問題,但你能解釋爲什麼有一個換行符請 – 2012-08-10 13:27:03

+0

@sachinirukula,當用戶輸入他們輸入'3'的數字並返回。返回在輸入流中插入一個新的行字符。新行字符不會被'scanf()'消耗,而是留在輸入流中。 – hmjd 2012-08-10 13:28:40

+0

@sachinirukula之所以回到古老的打字機之類的東西。當您按下等價物進入時,機器執行回車(回到紙張的最左側),然後更改爲新的行。 Windows的工作原理相同。 Windows文本文件甚至以ASCII符號'\ r'(ASCII 13)'\ n'(ASCII 10)結尾每行,它們分別被稱爲回車符和換行符。 – Lundin 2012-08-10 13:33:14

2

每次提示用戶輸入時,他們都會輸入,然後按回車。 Enter在輸入緩衝區中留下一個換行符。在請求字符輸入之前,您必須放棄它,否則它將最終放入字符變量中。

的容易,但生硬的解決方案是這樣的:

scanf("%d",&q); getchar(); 
printf("%d\n",q); 
for(j=0;j<q;j++){ 
    scanf("%c %d %d",&option,&l,&m); getchar(); 
    printf("%c %d %d",option,l,m); 
} 

(我敢肯定有這個地方是C常見問題,但我不能找到鏈接)

+0

hmjd的解決方案更加漂亮,所以我願意這樣做。 – Lundin 2012-08-10 13:29:11