You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

第二次调用fgets时出现Segmentation fault问题求助

解决第二次调用fgets时的段错误问题

先梳理你代码里几个关键问题,这些大概率是触发段错误的根源:

  • 第一个fgets后的多余分号:你写的if(fgets(inputString,255,stdin) != NULL);末尾多了个分号,这会让if语句的逻辑体变成空语句——不管fgets是否成功读取输入,程序都会直接执行后续代码。虽然这未必直接引发段错误,但会破坏程序控制流,可能导致后续操作出现意外。

  • 未完成的fgets调用:你的代码片段里第二个fgets被截断成了if(fge...,如果实际代码里是拼写错误(比如把fgets写成fge),编译器会直接报错;如果是参数传递错误(比如传入了空指针、已释放的内存),就会触发段错误。假设你原本是要读取正则表达式到inputexp,正确写法应该是:

    if(fgets(inputexp, sizeof(inputexp), stdin) != NULL) {
        // 这里处理输入的正则表达式
    }
    
  • 未初始化的二级指针cont:你声明了char **cont = NULL;,但如果后续直接用它存储单词(比如cont[Words] = ...),访问空指针会立刻触发段错误。如果需要动态存储多个字符串,得先给cont分配内存:

    // 先分配初始内存,比如能存10个字符串指针
    cont = malloc(10 * sizeof(char*));
    if(cont == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    

    后续如果需要扩容,还要用realloc调整内存大小。

另外补充几个fgets的使用注意点:

  • 确保传给fgets的缓冲区是有效的(你代码里的inputexp和inputString都是栈上分配的数组,这部分没问题),别传入空指针或已释放的内存。
  • fgets会把换行符读入缓冲区,要是不需要换行符,可以用strcspn去掉:
    inputString[strcspn(inputString, "\n")] = '\0';
    

把这些问题修复后,程序应该就能正常运行,不会在第二次调用fgets时出现段错误了。

内容的提问来源于stack exchange,提问作者JanPaul Schnabel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:52:41