2013-03-30 108 views
0

我寫了一些小問題,要求用戶輸入一些(行和列),然後應該將數組中的所有內容都設置爲一個點(「。」)並將其打印出來,但這使我的應用程序崩潰。打印多維數組

void main() 
{ 


    int i,j, m, n; 

      printf("The number of lines (m): "); 
      scanf("%d", m); 
      printf("\nThe number of columns (n): "); 
      scanf("%d", n); 


    //create my array 

    char mineGrid[n][m]; 

    //set all fields in to safe (.) 

    for (j = 0; j <= n; j++) 
    { 
     for (i = 0; i <= m; i++) 
      { 
      mineGrid[j][i] = "."; 
      } 
    } 
    //print a grid of dots 

    for (j = 0; j <= n; j++) 
    { 
     for (i = 0; i <= m; i++) 
      { 
      printf("%s", mineGrid[j][i]); 
      } 
    } 
} 

任何想法爲什麼這是崩潰?

回答

0

這是因爲你要在數組中放置一個字符串而不是char。

像這樣做:

void main() 
{ 


    int i,j, m, n; 

    m = 5; 
    n = 6; 



    //create my array 

    char mineGrid[n][m]; 

    //set all fields in to safe (.) 

    for (j = 0; j <= n; j++) 
    { 
     for (i = 0; i <= m; i++) 
     { 
      mineGrid[j][i] = '.'; 
     } 
    } 
    //print a grid of dots 

    for (j = 0; j <= n; j++) 
    { 
     for (i = 0; i <= m; i++) 
     { 
      printf("%c", mineGrid[j][i]); 
     } 
     printf("\n"); 
    } 
} 
+0

我不認爲你是正確的。你認爲'm,n'是賦值後的常量。但他們不是。可變長度陣列允許來自C99標準。 – Mahesh

+0

Derr。看了一會兒。非常感謝! – user968127

0

創建N×M個元素,但是使用n + 1個X m + 1個數組元素。使用像波紋管

一個

for (j = 0; j < n; j++) 
{ 
    for (i = 0; i < m; i++) 
    { 
     mineGrid[j][i] = '.'; 
    } 
} 
0

這是因爲對尺寸Ñ的陣列,所述有效陣列索引0到N-1。但是您正在訪問N th元素,它不是有效的數組索引,並且訪問它會調用未定義的行爲。

for (j = 0; j <= n; j++) 
{ 
    for (i = 0; i <= m; i++) // Array out of bounds in either condition check 

說了這話,你也有你的輸入問題。

scanf("%d", m); // Missing & operator before m. 
2

在這裏最主要的問題的原因是,你有很多環,看起來就像

for (j = 0; j <= n; j++) 
/*   ^ */ 
/*    |  */ 
/*   Look! */ 

將從0運行jn,但你已經聲明瞭數組作爲

char mineGrid[n][m]; 

這意味着空間已分配給編號爲0n-1的行。

所有你索引循環都是這樣錯誤的。寫這些循環的idomatic方式是

for (j = 0; j < n; ++j) 

,我有固定的範圍,也改變了從增量到後預這是一個古老的微型優化通常不會使在C這些天有什麼區別(因爲編譯器足夠聰明,可以修復它),但是如果你切換到C++並且以這種方式使用非平凡類,可以。所以我把它放在我的小事情列表中來「修復」。

+0

我寫了同樣的東西 – Civa

+0

也歡呼!我在那裏有點瘋了一秒!正準備用筆和紙來繪製它。 – user968127