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

知道为什么这会崩溃吗?

4

4 回答 4

2

这里的主要问题是你有很多看起来像的循环

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

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

char mineGrid[n][m];

这意味着已为编号为 的行分配了0空间n-1

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

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

我已经固定了范围并将增量从 post- 更改为 pre- 这是一个旧的微优化,这些天通常在 c 中没有任何区别(因为编译器足够聪明来修复它),但是如果你可以切换到 c++ 并以这种方式使用非平凡的类。所以我把它放在我要“修复”的小事情清单中。

于 2013-03-30T03:30:46.393 回答
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");
    }
}
于 2013-03-30T03:17:00.660 回答
0

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

一种

for (j = 0; j < n; j++)
{
    for (i = 0; i < m; i++)
    {
        mineGrid[j][i] = '.';
    }
}
于 2013-03-30T03:29:48.827 回答
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.
于 2013-03-30T03:30:35.627 回答