宽使织 2023-01-29 22:33 采纳率: 100%
浏览 45
已结题

关于#c语言#的问题:我的目的是1到13阶任意奇数阶幻方问题解决,我是在VS2022调试的

我遇到了一个问题,不知道为什么会出现“正在从“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)

发现并不是,所以我就感到很困惑,请问为什么会出现这种提示呢?

  • 写回答

3条回答 默认 最新

  • CodeBytes 2023-01-30 16:12
    关注

    这个问题是由于数组越界导致的,当 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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 修改了问题 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输