我写了一个小程序,要求用户输入一些输入(行数和颜色),然后将数组中的所有内容设置为点(".")并打印出来,但是这会导致应用程序崩溃。
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
运行j
到n
,但您已将数组声明为
char mineGrid[n][m];
表示已经为编号为0
到n-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.