鱼C论坛

 找回密码
 立即注册
查看: 2009|回复: 2

[已解决]for循环存入二维字符数组的数据和对应位置输出的值不一样

[复制链接]
发表于 2023-4-19 17:00:11 | 显示全部楼层 |阅读模式
10鱼币
代码清单
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 1024

int main()
{
    char import[MAX];//定义此字符数组用于接收用户输入的数据
    char export[3][3];
    int i, j, num;
    int k = 0;

    //获取import数组的元素
    fgets(import, MAX, stdin);

    //获取每一行每一列应有多少个元素
    num = (int)sqrt(strlen(import) - 1);
    //printf("num: %d\n", num);

    //将import数组的前num*num个元素存入export数组
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            *(*(export + i) + j) = import[k];
            k++;
        }
    }

    //输出结果
    printf("export[0][3] = %c\n", *(*export + 3));
    printf("import[3] = %c\n", import[3]);
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            printf("%c ", *(*(export + i) + j));
        }
        printf("\n");
    }

    return 0;

}

描述:
输入012345678987654321的时候,第四列前三行的元素都与设定的输入的不同,eg. export[0][3]在第一个循环过程中利用printf函数输出的时候时3,但是出了第一个循环之后再用printf函数输出的时候就变成了4

结果示例:
0123456789876543210
export[0][3] = 4
import[3] = 3
0 1 2 4
4 5 6 8
8 9 8 6
6 5 4 3
最佳答案
2023-4-19 17:00:12
问题原因出在数组下标越界。因为你定义的 export 数组大小是 3x3,在嵌套循环中,当访问 export[0][3] 时,已经超出了数组的范围。这会导致未定义的行为,所以你看到了错误的结果。

要修复这个问题,你可以考虑以下几个方法:

方法一:扩大 export 数组的大小。例如,将数组定义为 char export[4][4];。这会给你足够的空间来存储 16 个字符。这种方法可以让你按照输入的内容来调整数组大小。

方法二:在循环中正确访问数组元素。修改 printf 语句以访问正确的数组下标。例如,使用 printf("export[0][3] = %c\n", export[0][2]);。

以下是修复后的代码示例:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 1024

int main()
{
    char import[MAX];
    char export[4][4];
    int i, j, num;
    int k = 0;

    fgets(import, MAX, stdin);

    num = (int)sqrt(strlen(import) - 1);

    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            export[i][j] = import[k];
            k++;
        }
    }

    printf("export[0][3] = %c\n", export[0][2]);
    printf("import[3] = %c\n", import[3]);
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            printf("%c ", export[i][j]);
        }
        printf("\n");
    }

    return 0;
}

这样,在输入 0123456789876543210 的情况下,输出应该是:
0123456789876543210
export[0][3] = 3
import[3] = 3
0 1 2 3
4 5 6 7
8 9 8 7
6 5 4 3

最佳答案

查看完整内容

问题原因出在数组下标越界。因为你定义的 export 数组大小是 3x3,在嵌套循环中,当访问 export[0][3] 时,已经超出了数组的范围。这会导致未定义的行为,所以你看到了错误的结果。 要修复这个问题,你可以考虑以下几个方法: 方法一:扩大 export 数组的大小。例如,将数组定义为 char export[4][4];。这会给你足够的空间来存储 16 个字符。这种方法可以让你按照输入的内容来调整数组大小。 方法二:在循环中正确访问数 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-19 17:00:12 | 显示全部楼层    本楼为最佳答案   
问题原因出在数组下标越界。因为你定义的 export 数组大小是 3x3,在嵌套循环中,当访问 export[0][3] 时,已经超出了数组的范围。这会导致未定义的行为,所以你看到了错误的结果。

要修复这个问题,你可以考虑以下几个方法:

方法一:扩大 export 数组的大小。例如,将数组定义为 char export[4][4];。这会给你足够的空间来存储 16 个字符。这种方法可以让你按照输入的内容来调整数组大小。

方法二:在循环中正确访问数组元素。修改 printf 语句以访问正确的数组下标。例如,使用 printf("export[0][3] = %c\n", export[0][2]);。

以下是修复后的代码示例:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 1024

int main()
{
    char import[MAX];
    char export[4][4];
    int i, j, num;
    int k = 0;

    fgets(import, MAX, stdin);

    num = (int)sqrt(strlen(import) - 1);

    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            export[i][j] = import[k];
            k++;
        }
    }

    printf("export[0][3] = %c\n", export[0][2]);
    printf("import[3] = %c\n", import[3]);
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < num; j++)
        {
            printf("%c ", export[i][j]);
        }
        printf("\n");
    }

    return 0;
}

这样,在输入 0123456789876543210 的情况下,输出应该是:
0123456789876543210
export[0][3] = 3
import[3] = 3
0 1 2 3
4 5 6 7
8 9 8 7
6 5 4 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-20 10:18:49 | 显示全部楼层
isdkz 发表于 2023-4-19 17:00
问题原因出在数组下标越界。因为你定义的 export 数组大小是 3x3,在嵌套循环中,当访问 export[0][3] 时, ...

谢谢您!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表