鱼C论坛

 找回密码
 立即注册
查看: 1437|回复: 5

[已解决]CodeBlocks C语言编程问题,求助求助

[复制链接]
发表于 2023-11-1 10:02:07 | 显示全部楼层 |阅读模式
10鱼币
编写C语言S1E26课后作业时,无报错,输入英文按下回车后EXE停止工作,但是复制小甲鱼答案运行却没问题,请大家帮我看看这是什么情况,感谢感谢
#include <stdio.h>

int main()
{
    char str[1024] = { 0 };
    char *sp = str[0];
    int i, j;
    int count = 0, para = 0, max = 0;
    int get;

    printf("请输入一个英文句子:");
    while((get = getchar()) != '\n')        //存储数据,获取长度和句子数量
    {
        *sp++ = get;
        count++;
        if(get == ' ')
        {
            para++;
            if(count > max)
            {
                max = count;
            }
            count = 0;
        }
    }

    char result[para][max];         //初始化可变长数组
    for(i = 0; i < para; i++)
    {
        for(j = 0; j < max; j++)
        {
            result[i][j] = 0;
        }
    }

    sp = str[0];                //转移数据到result中
    for(i = 0; i < para; i++)
    {
        for(j = 0; j < max; j++)
        {
            if(*sp == 0 || *sp == ' ')
            {
                continue;
            }
            result[i][j] = *sp++;
        }
    }
    printf("分割结果已存入到result[%d][%d]中.", para, max);

    for(i = 0; i < para; i++)
    {
        printf("%s", result[i]);
        printf("\n");
    }
    return 0;
}
最佳答案
2023-11-1 10:02:08
问题分析:

根据你的描述,代码在运行时出现了问题,输入英文后按下回车,程序停止工作。这可能是由于以下几个原因导致的问题:

1. 内存越界:在代码中,定义了一个 str 数组来存储输入的句子,长度为 1024。然后定义了一个指针 sp 指向 str[0],用于存储字符。但是在 sp = str[0]; 这一行,使用了数组下标访问 str[0] 的值,这是不正确的,应该使用 sp = &str[0]; 来获取指针地址。

修改建议:

下面是修改后的代码,修复了上述问题:
++#include <stdio.h>int main() {    char str[1024] = { 0 };    char *sp = &str[0];  // 修改此处    int i, j;    int count = 0, para = 0, max = 0;    int get;        printf("请输入一个英文句子:");    while((get = getchar()) != '\n')    {        *sp++ = get;        count++;        if(get == ' ')        {            para++;            if(count > max)            {                max = count;            }            count = 0;        }    }        char result[para][max];    for(i = 0; i < para; i++)    {        for(j = 0; j < max; j++)        {            result[i][j] = 0;        }    }        sp = &str[0];  // 修改此处    for(i = 0; i < para; i++)    {        for(j = 0; j < max; j++)        {            if(*sp == 0 || *sp == ' ')            {                continue;            }            result[i][j] = *sp++;        }    }        printf("分割结果已存入到result[%d][%d]中.", para, max);        for(i = 0; i < para; i++)    {        printf("%s\n", result[i]);    }        return 0;}
修改后的代码将 sp 的赋值改为 sp = &str[0];,确保指针指向数组正确的地址。另外,在打印 result[i] 时,增加了换行符 \n,使输出结果更清晰。

希望能帮到你!

球一个最佳答案谢谢啦!这对我非常重要!
捕获.PNG

最佳答案

查看完整内容

问题分析: 根据你的描述,代码在运行时出现了问题,输入英文后按下回车,程序停止工作。这可能是由于以下几个原因导致的问题: 1. 内存越界:在代码中,定义了一个 str 数组来存储输入的句子,长度为 1024。然后定义了一个指针 sp 指向 str[0],用于存储字符。但是在 sp = str[0]; 这一行,使用了数组下标访问 str[0] 的值,这是不正确的,应该使用 sp = &str[0]; 来获取指针地址。 修改建议: 下面是修改后的代码,修复了上 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 10:02:08 | 显示全部楼层    本楼为最佳答案   
问题分析:

根据你的描述,代码在运行时出现了问题,输入英文后按下回车,程序停止工作。这可能是由于以下几个原因导致的问题:

1. 内存越界:在代码中,定义了一个 str 数组来存储输入的句子,长度为 1024。然后定义了一个指针 sp 指向 str[0],用于存储字符。但是在 sp = str[0]; 这一行,使用了数组下标访问 str[0] 的值,这是不正确的,应该使用 sp = &str[0]; 来获取指针地址。

修改建议:

下面是修改后的代码,修复了上述问题:
++#include <stdio.h>int main() {    char str[1024] = { 0 };    char *sp = &str[0];  // 修改此处    int i, j;    int count = 0, para = 0, max = 0;    int get;        printf("请输入一个英文句子:");    while((get = getchar()) != '\n')    {        *sp++ = get;        count++;        if(get == ' ')        {            para++;            if(count > max)            {                max = count;            }            count = 0;        }    }        char result[para][max];    for(i = 0; i < para; i++)    {        for(j = 0; j < max; j++)        {            result[i][j] = 0;        }    }        sp = &str[0];  // 修改此处    for(i = 0; i < para; i++)    {        for(j = 0; j < max; j++)        {            if(*sp == 0 || *sp == ' ')            {                continue;            }            result[i][j] = *sp++;        }    }        printf("分割结果已存入到result[%d][%d]中.", para, max);        for(i = 0; i < para; i++)    {        printf("%s\n", result[i]);    }        return 0;}
修改后的代码将 sp 的赋值改为 sp = &str[0];,确保指针指向数组正确的地址。另外,在打印 result[i] 时,增加了换行符 \n,使输出结果更清晰。

希望能帮到你!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 10:02:20 | 显示全部楼层
问题出在这行代码上:char *sp = str[0];
在这里,你将一个字符赋值给了一个字符指针,这是不正确的。正确的做法是将字符数组的地址赋值给字符指针。所以应该修改为:char *sp = &str[0]。

此外,你还有一个错误是在定义二维字符数组result时,使用了变量para和max,这是不允许的。C语言中,数组的大小必须是常量表达式,不能是变量。所以,你需要使用动态内存分配来解决这个问题。

你可以使用malloc函数来动态分配内存,具体代码如下:

char result = (char )malloc(para * sizeof(char *));  // 分配para个指针的空间
for(i = 0; i < para; i++)
{
    result[ i] = (char *)malloc(max * sizeof(char));  // 分配max个字符的空间
}

这样,你就可以正确地定义一个二维字符数组了。

最后,不要忘记在程序结束后释放动态分配的内存,使用free函数来释放内存,具体代码如下:

for(i = 0; i < para; i++)
{
    free(result[ i]);
}
free(result);

这样,你的程序就不会再出现停止工作的问题了。希望能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-1 10:10:01 | 显示全部楼层
isdkz 发表于 2023-11-1 10:02
问题出在这行代码上:char *sp = str[0];
在这里,你将一个字符赋值给了一个字符指针,这是不正确的。正确 ...

你好,请问我在小甲鱼的课程中学到C99标准中支持可变数组编程,请问是我定义的不标准还是在正式编程中不建议用容易出现一些问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-1 10:16:40 | 显示全部楼层
Mike_python小 发表于 2023-11-1 10:04
问题分析:

根据你的描述,代码在运行时出现了问题,输入英文后按下回车,程序停止工作。这可能是由于以下 ...

好的,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-1 10:54:45 | 显示全部楼层
Mike_python小 发表于 2023-11-1 10:02
问题分析:

根据你的描述,代码在运行时出现了问题,输入英文后按下回车,程序停止工作。这可能是由于以下 ...

请问这个代码为啥最后打印不出来结果呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 08:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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