我遇到了一个问题,不知道为什么会出现“正在从“a”中读取无效数据“和”写入“a”时缓冲区溢出”,是在这里出现的
if (a[i][j] == 0)
a[i][j] = k;
下面是源码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[15][15] = { 0 };
int i, j, n, k, n1;
i = 1;
printf("Please input any positive integer:\n");
scanf_s("%d", &n1);
n = n1 % 6 * 2 + 1;
j = n / 2 + 1;
a[i][j] = 1;
for (k = 2; k <= n * n; k++)
{
i = i - 1;
j = j + 1;
if (i <= 0 && j <= n)
i = n;
if (i <= 0 && j > n)
{
i = i + 2;
j = j - 1;
}
if (j > n)
{
j = 1;
}
if (i >= 15 || j >= 15)
{
printf("!!!!!!!");
exit(1);
}
else
{
if (a[i][j] == 0)
a[i][j] = k;
else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
}
for (i = 1; i <= n; i++)
{
for (j = 0; j <= n; j++)
printf("%10d", a[i][j]);
printf("\n");
}
return 0;
}
我的目的是1到13阶任意奇数阶幻方问题解决,我是在VS2022调试的。这个程序能是能得出结果。我本来以为是下标越界了,但是我添加了
if (i >= 15 || j >= 15)
发现并不是,所以我就感到很困惑,请问为什么会出现这种提示呢?
这个问题是由于数组越界导致的,当 i 或者 j 的值大于了 15 就会出现此问题,你可以修改判断条件使其不超出范围。例如:
这个问题是由于数组越界导致的,当 i 或者 j 的值大于了 15 就会出现此问题,你可以修改判断条件使其不超出范围。例如:
if (i >= n || j >= n) {
printf("!!!!!!!");
exit(1);
}
完整代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[15][15] = { 0 };
int i, j, n, k, n1;
i = 1;
printf("Please input any positive integer:\n");
scanf_s("%d", &n1);
n = n1 % 6 * 2 + 1;
j = n / 2 + 1;
a[i][j] = 1;
for (k = 2; k <= n * n; k++)
{
i = i - 1;
j = j + 1;
if (i <= 0 && j <= n)
i = n;
if (i <= 0 && j > n)
{
i = i + 2;
j = j - 1;
}
if (j > n)
{
j = 1;
}
if (i >= 15 || j >= 15)
{
printf("!!!!!!!");
exit(1);
}
else
{
if (a[i][j] == 0)
a[i][j] = k;
else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
}
for (i = 1; i <= n; i++)
{
for (j = 0; j <= n; j++)
printf("%10d", a[i][j]);
printf("\n");
}
return 0;
}
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
“多一少一”问题占程序员常犯错误的10%以上!
避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为
x、x-1、x+1中的哪个?
<、<=、==、>、>=中的哪个?