第二次调用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
相关产品推荐
相关产品推荐

