You need to enable JavaScript to run this app. C语言用if判断文件名实现CSV转TXT时分支失效问题
优惠活动
大模型
产品
解决方案
定价
更多

C语言用if判断文件名实现CSV转TXT时分支失效问题

问题成因与修复方案

核心错误根源

  • 误用==做字符串内容比较
    C语言中,==运算符作用于两个字符指针/数组名时,比较的是两者的内存地址值,不是字符串存储的实际内容。代码中filename是栈上分配的字符数组首地址,硬编码的字符串常量(如"Equilibrium_trajectories.csv")是存储在程序只读数据段的常量地址,两个地址永远不可能相等,因此所有if分支判断都会直接落入else分支,触发报错。
  • 输入字符串清洗逻辑完全无效
    代码中strtok(filename,"\n")没有接收函数返回值,也没有修改原数组的内容,根本无法清除fgets从标准输入读入的末尾换行符。哪怕换用正确的字符串比较方法,输入的文件名末尾残留的\n也会导致和硬编码的常量字符串内容不匹配。
  • 未做文件打开失败校验的隐患
    调用fopen(filename, "r+")后没有判断返回的FILE*指针是否为NULL,若输入的CSV文件不存在,后续直接对空指针执行fgets操作会触发段错误,程序直接崩溃,根本走不到后续的分支判断逻辑。

正确修复方式

字符串内容比较必须使用标准库函数strcmp(),该函数会逐字符对比两个字符串的实际内容,当两个字符串完全一致时返回0。

  1. 替换无效的换行符清除逻辑:
    size_t name_len = strlen(filename);
    // 清除fgets读入的末尾换行符
    if (name_len > 0 && filename[name_len - 1] == '\n') {
        filename[name_len - 1] = '\0';
    }
    
  2. 替换所有==的字符串判断为strcmp判断:
    if (strcmp(filename, "Equilibrium_trajectories.csv") == 0) {
        sprintf(textfile, "Chemical_equilibrium.txt");
        puts(textfile);
        fp1 = fopen(textfile, "w+");
    } else if (strcmp(filename, "CH4_diffusion.csv") == 0) {
        sprintf(textfile, "Counter_diffusion_flame.txt");
        puts(textfile);
        fp1 = fopen(textfile, "w+");
    } else {
        printf("ERROR 404: Unsupported input CSV file\n");
        exit(EXIT_FAILURE);
    }
    
  3. 补充文件打开校验逻辑,避免空指针访问:
    fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("ERROR: Cannot open input CSV file %s\n", filename);
        exit(EXIT_FAILURE);
    }
    

更健壮的实现方式可以不硬编码文件名分支,直接从输入的CSV文件名中截取主文件名,替换后缀为.txt自动生成输出文件名,减少后续维护成本。


内容的提问来源于stack exchange,提问作者Emotional Damage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 15:15:08