2013-04-13 163 views
0

我想輸入數組中的一個接一個16個字符...爲什麼不SCANF正常工作

#include<stdio.h> 
void main(){ 
int i,j; 
char a[4][4]; 
printf("Enter Values in array : "); 
for (i=0 ; i<=3 ; i++) 
{ 
for (j=0 ; j<=3 ; j++) 
{ 
    printf("a[%d][%d] : ",i,j); 
    scanf("%c",&a[i][j]); 
}} 
for (i=0 ; i<=3 ; i++) 
{ 
for (j=0 ; j<=3 ; j++) 
{ 
    printf("a[%d][%d] : %c\n",i,j,a[i][j]); 
}}} 

和輸出

a[0][0] : q 
a[0][1] : a[0][2] : w 
a[0][3] : a[1][0] : e 
a[1][1] : a[1][2] : r 
a[1][3] : a[2][0] : t 
a[2][1] : a[2][2] : y 
a[2][3] : a[3][0] : u 
a[3][1] : a[3][2] : i 
a[3][3] : 

爲什麼在一個斜面I輸入[ 0] [1],a [0] [3]等....爲什麼他們被跳過... 也請告訴更好的方法來使這項工作...

+2

對於for循環,推薦的C語言習慣用於(i = 0; i <4; i ++)',使用'小於數組維度'。 –

回答

5

scanf()輸入緩衝區中的換行符會被後續消耗調用。

告訴scanf()跳過空格。

scanf(" %c",&a[i][j]); // Notice the space in the format string 

格式說明的空間使得scanf()的讀取字符(%c)之前忽略任何空白字符

+0

真棒...它的工作... thnxxx人 –

1

通過KingsIndian答案解釋的問題。

作爲解決方案,我將使用getchar()或getwchar()(請參閱man 3 getchar)。 通過閱讀文字廣告時,您可以:

  1. 檢查你讀出的字符是否屬於你期待(見文件ctype.h或wctype.h)

  2. 類型放棄那些你不要像空白,CR,LF選項卡等。

2

這是以C語言進行字符輸入時的問題。當我們鍵入一個字符並按下ENTER鍵時,ENTER的ASCII值將成爲下一個scanf的值。

你需要刷新標準輸入緩衝區,爲此你應該寫fflush(stdin)。

#include<stdio.h> 

    void main(){ 

    int i,j; 
    char a[4][4]; 
    printf("Enter Values in array : "); 

    for (i=0 ; i<=3 ; i++) 
    { 
    for (j=0 ; j<=3 ; j++) 
    { 
     printf("a[%d][%d] : ",i,j); 
     scanf("%c",&a[i][j]); 
     fflush(stdin);// will clear the input buffer stdin 

    } 
    } 
    for (i=0 ; i<=3 ; i++) 
    { 
    for (j=0 ; j<=3 ; j++) 
    { 
     printf("a[%d][%d] : %c\n",i,j,a[i][j]); 
    } 
    } 
    } 
+2

C標準只定義了輸出流的fflush的行爲。 fflush(stdin)調用未定義的行爲。 –

+0

很多時候我已經閱讀** fflush(stdin)**的概念在**「讓我們C」**書中,並且當我在我的代碼中使用它來解決類似的問題時,它運行得很好...... –

+0

即使在那些認爲他們的語言能夠教好或寫作的人中間,這也是一種常見的誤解。它在很多情況下都能正常工作,但絕對不能保證能正常工作。請參閱 http://stackoverflow.com/questions/2979209/using-fflushstdin以獲取標準的相關摘錄。 –