2013-03-30 107 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