终端输入文件名触发Segmentation Fault问题排查求助
问题分析与修复方案
你的代码存在几个关键错误,直接引发了段错误和其他潜在问题:
1. 未初始化的指针导致段错误
你声明了char *filename;但未为其分配内存空间,scanf("%s", filename);会尝试将输入的文件名写入一个未定义的内存地址,这必然触发Segmentation Fault。
修复方法:
- 方法一:用数组分配固定大小的缓冲区(推荐,简单安全):
char filename[256]; // 足够容纳绝大多数常见文件名 - 方法二:动态分配内存(需记得释放):
char *filename = malloc(256 * sizeof(char)); // 使用完成后执行 free(filename); 释放内存
2. 未初始化统计变量count
代码中count没有初始化为0,统计行数时会得到随机的垃圾值,导致结果完全错误。
修复:
int count = 0;
3. 错误使用feof()
while(!feof(file))的写法逻辑错误:feof只有在尝试读取文件末尾之后才会返回真,这会导致最后一行被重复统计(或多统计一次空行)。正确的写法是在读取字符时直接判断是否到达文件末尾:
修复:
int ch; while((ch = fgetc(file)) != EOF){ if(ch == '\n'){ count++; } }
4. 未检查文件是否成功打开
如果输入的文件名不存在或无权限访问,fopen会返回NULL,后续对file的操作会导致未定义行为。
修复:
FILE *file = fopen(filename,"r"); if(file == NULL){ perror("Failed to open file"); return 1; // 异常退出程序 }
完整修复后的代码示例
#include <stdio.h> #include <stdlib.h> // 使用malloc时需要此头文件 int main(){ // 分配文件名缓冲区 char filename[256]; printf("Please enter file name: "); scanf("%s", filename); // 打开文件并检查是否成功 FILE *file = fopen(filename,"r"); if(file == NULL){ perror("Failed to open file"); return 1; } // 统计行数(数据点数量) int count = 0; int ch; while((ch = fgetc(file)) != EOF){ if(ch == '\n'){ count++; } } fclose(file); printf("it is done\n"); printf("%i\n", count); return 0; }
内容的提问来源于stack exchange,提问作者STOI
相关产品推荐
相关产品推荐

