打印一个多维数组



我写了一个小程序,要求用户输入一些输入(行数和颜色),然后将数组中的所有内容设置为点(".")并打印出来,但是这会导致应用程序崩溃。

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

知道为什么会崩溃吗?

这里的主要问题是你有很多像

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

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

char mineGrid[n][m];

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

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

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

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

这是因为您在数组中放入了字符串而不是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");
    }
}

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

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

这是因为对于大小为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.

相关内容

  • 没有找到相关文章

最新更新