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

终端输入文件名触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:43:21