1436466587 发表于 2023-11-1 10:02:07

CodeBlocks C语言编程问题,求助求助

编写C语言S1E26课后作业时,无报错,输入英文按下回车后EXE停止工作,但是复制小甲鱼答案运行却没问题,请大家帮我看看这是什么情况,感谢感谢
#include <stdio.h>

int main()
{
    char str = { 0 };
    char *sp = str;
    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;         //初始化可变长数组
    for(i = 0; i < para; i++)
    {
      for(j = 0; j < max; j++)
      {
            result = 0;
      }
    }

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

    for(i = 0; i < para; i++)
    {
      printf("%s", result);
      printf("\n");
    }
    return 0;
}

Mike_python小 发表于 2023-11-1 10:02:08

问题分析:

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

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

修改建议:

下面是修改后的代码,修复了上述问题:

++
#include <stdio.h>
int main() {
    char str = { 0 };
    char *sp = &str;// 修改此处
    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;
    for(i = 0; i < para; i++)
    {
      for(j = 0; j < max; j++)
      {
            result = 0;
      }
    }
   
    sp = &str;// 修改此处
    for(i = 0; i < para; i++)
    {
      for(j = 0; j < max; j++)
      {
            if(*sp == 0 || *sp == ' ')
            {
                continue;
            }
            result = *sp++;
      }
    }
   
    printf("分割结果已存入到result[%d][%d]中.", para, max);
   
    for(i = 0; i < para; i++)
    {
      printf("%s\n", result);
    }
   
    return 0;
}


修改后的代码将 sp 的赋值改为 sp = &str;,确保指针指向数组正确的地址。另外,在打印 result 时,增加了换行符 \n,使输出结果更清晰。

希望能帮到你!

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-11-1 10:02:20

问题出在这行代码上:char *sp = str;
在这里,你将一个字符赋值给了一个字符指针,这是不正确的。正确的做法是将字符数组的地址赋值给字符指针。所以应该修改为:char *sp = &str。

此外,你还有一个错误是在定义二维字符数组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);

这样,你的程序就不会再出现停止工作的问题了。希望能帮到你!

1436466587 发表于 2023-11-1 10:10:01

isdkz 发表于 2023-11-1 10:02
问题出在这行代码上:char *sp = str;
在这里,你将一个字符赋值给了一个字符指针,这是不正确的。正确 ...

你好,请问我在小甲鱼的课程中学到C99标准中支持可变数组编程,请问是我定义的不标准还是在正式编程中不建议用容易出现一些问题{:10_257:}

1436466587 发表于 2023-11-1 10:16:40

Mike_python小 发表于 2023-11-1 10:04
问题分析:

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

好的,谢谢大佬

1436466587 发表于 2023-11-1 10:54:45

Mike_python小 发表于 2023-11-1 10:02
问题分析:

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

请问这个代码为啥最后打印不出来结果呀
页: [1]
查看完整版本: CodeBlocks C语言编程问题,求助求助