打印多维数组

时间:2013-03-30 03:05:58

标签: c arrays multidimensional-array

我写了一个小东西,询问用户一些输入(行和列),然后应该将数组中的所有内容设置为点(“。”)并将其打印出来,但这会导致我的应用程序崩溃。

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]);
          }
    }
}

知道为什么会崩溃吗?

4 个答案:

答案 0 :(得分:2)

这里出现重大问题的原因是你有很多看起来像

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

将从j运行0n,但您已将数组声明为

char mineGrid[n][m];

表示已为编号为0n-1的行分配了空格。

所有索引循环都是错误的。编写这些循环的惯用方法是

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

我已经修改了范围并且还将增量从post更改为pre-这是一个旧的微优化,这些天通常不会对c产生任何影响(因为编译器足够智能来修复它),但是如果你切换到c ++并以这种方式使用一个非平凡的类,可以。所以我把它保存在我要修复的小东西列表中。

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

您创建了n X m个元素,但在数组中使用了n + 1 X m + 1个元素。像bellow一样使用

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

答案 3 :(得分:0)

这是因为对于大小 N 的数组,有效数组索引 0到N-1 。但是您正在访问 N 元素,该元素不是有效的数组索引,访问它会调用未定义的行为。

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.