2015-06-18 33 views
1

首先,這似乎與this問題重複,但在我的情況下,爲什麼這隻發生在第一次循環迭代(第一個數組元素的輸入)。爲什麼不是所有?爲什麼scanf要求輸入兩次,但只是在第一次循環迭代?

我的代碼:

#include "stdio.h" 

int main(int argc, char const *argv[]) 
{ 
    int a[5]; 
    int i; 
    for (i = 0; i < 5; i++) { 
     printf("Input a[%d]:\n", i); 
     int x = scanf("%d ", &a[i]); // notice the white-space after %d 
    } 
    for (i = 0; i < 5; ++i) 
    { 
     printf("a[%d]=%d\n", i, a[i]); 
    } 
} 

輸出例如:

Input a[0]: 
1 
2 
Input a[1]: 
3 
Input a[2]: 
4 
Input a[3]: 
5 
Input a[4]: 
6 
a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 

爲什麼只針對a[0]但不能用於其他要求輸入了兩次,也就是爲什麼分配給a[1-5]的值是在它之前的一個循環迭代中輸入的值?

我讀this的答案,但我仍然不明白爲什麼它沒有要求在每個循環中輸入兩次。有明確的解釋嗎?

+1

'的scanf( 「%d 」' - >'的scanf(「 %d」'(降空間)的額外空間告訴'scanf()'繼續查找,直到檢測到非空格爲止。 – chux

+0

請不要使用'scanf()'。**使用非常困難,而且**會導致細微的,難以如果你想從標準輸入中得到每行一個項目,可以使用'fgets()'來代替。 –

+0

@TheParamagneticCroissant:你可能對'scanf()'和'fgets()'是正確的,但我是試圖瞭解這裏的微妙,難以追蹤的錯誤:) – theman

回答

2

在你的情況,

scanf("%d ", &a[i]); 

掃描整數,scanf()需要匹配一個非空白字符才能完成的空白,以及任意數量的空格直到比賽。

因此,對於第一次,第二輸入是所述非白色空間,這會終止掃描,但留在緩衝器(未讀保持)用於下一掃描

下一次起,最後輸入(留在緩衝區)被認爲是掃描輸入,和當前輸入工作爲終結,剛要留在緩衝區等。

因此,最後一個輸入(6)從未實際讀入陣列,而僅僅保留爲終止符。連續的前五個輸入被考慮。 只是要清楚,從C11,章§7.21.6.2,第(5)報價,重點煤礦

的空白字符(S)組成的指令被讀取輸入到執行第一個非空白字符(仍未讀取),或直到不能再讀取字符。

+0

非常感謝!如果我只知道「第二個輸入是非空白區域,它終止掃描,但留在緩衝區(仍未讀取)」,我本可以回答這個問題。那麼,您能否給我一些標準文檔或任何其他文章中的參考資料來解釋輸入/輸出緩衝區如何工作? – theman

0

@Sourav Ghosh很好地解釋了關於scanf()

爲了闡明用戶體驗,棘手的附加部分是stdin通常是行緩衝。這意味着沒有用戶輸入stdin,直到輸入或發生EOF。這就是爲什麼當輸入2(指令" "scanf("%d ",...中尋求的非空格)時,第一個scanf()未返回。用戶必須鍵入2輸入,然後stdin得到"2\n"然後scanf()看到2,使其在stdin中未讀,然後返回。

0

以下代碼:

1)沒有提出編譯警告I.E.符合乾淨

2)適當地處理與scanf()的任何錯誤條件

3)適當地處理與程序退出 '返回(0);'

4)包括用於出口()和EXIT_FAILURE

5 stdlib.h中)正常聲明main()函數時不使用可選參數argc和argv。

6)可以解決該問題與在scanf格式字符串()

#include "stdio.h" 
#include <stdlib.h> // exit and EXIT_FAILURE 

#define MAX_A_LEN (5) 

int main(void) 
{ 
    int a[ MAX_A_LEN ]; 
    int i; // loop index 

    for (i = 0; i < MAX_A_LEN; i++) 
    { 
     printf("Input a[%d]:\n", i); 
     if(1 != scanf("%d", &a[i]))  
     { // then scanf failed 
      perror("scanf failed"); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, scanf successful 
    } 

    for (i = 0; i < MAX_A_LEN; ++i) 
    { 
     printf("a[%d]=%d\n", i, a[i]); 
    } 

    return(0); 
} // end function: main 
相關問題