2016-10-04 69 views
2

我正在嘗試創建一個網格,例如4行和4列。網格的尺寸爲n * n尺寸。我已經嘗試了下面這段代碼,它僅適用於3行,因爲我試圖打印4 * 4網格。但最後一個網格(第4個是這種情況)從不打印。我的意思是一旦打印第三個網格,循環就會退出。如果有人幫我弄清楚爲什麼只有3行4列,而不是4行4列?以下是我迄今爲止嘗試過,使用n * n指定尺寸的打印網格

void main() 
{ 
int n, i, j; 
scanf("%d", &n); 
char grid[n][n]; 

    for (i = 0; i < n; i++) { 
     for (j = 0; j < n; j++) { 
     scanf("%c", &grid[i][j]); 
     } 
    } 

    for (i = 0; i < n; i++) { 
     for (j = 0; j < n; j++) { 
      if (grid[i][j] == '9') 
      printf("X"); 
      else 
      printf("%c", grid[i][j]); 
     } 

    } 

} 
+2

可能因爲'scanf(「%c」,...)'也會讀取'newline'字符。 –

+0

@WeatherVane,這應該是一個答案 – StoryTeller

+0

或者'scanf(「%d」,n)'將會讀取多於一位的數字 – Tibrogargan

回答

1

這是一個非常快速的破解讓你的代碼工作,因爲我相信你期望。包括在scanf的\n可能不是這樣做的最佳方式,請參閱this answer

int n, i, j; 
scanf("%d\n", &n); 
char grid[n][n]; 

for (i = 0; i < n; i++) { 
    for (j = 0; j < n; j++) { 
     scanf("%c", &grid[i][j]); 
    } 
} 

for (i = 0; i < n; i++) { 
    for (j = 0; j < n; j++) { 
     if (grid[i][j] == '9') 
      printf("X"); 
     else 
      printf("%c", grid[i][j]); 
    } 
    printf("\n"); 
} 

以此爲輸入:

4 
1234234534564567 

這是輸出:

1234 
2345 
3456 
4567 
1

scanf("%c", ...) 

也將讀取任何newline字符類型,其中包括一個按照前面

scanf("%d", ...) 

所以,如果你進入每行的數據後面跟着一個newline,您將在第三行之後讀取1 + 3 * 5 = 16個字符。

我建議你輸入四個字符串,並使用scanf("%s", ...)將每個字符複製到數組中。這樣,所有的空白將被忽略(除了最後的newline將保留在輸入緩衝區中)。