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。
- 替换无效的换行符清除逻辑:
size_t name_len = strlen(filename); // 清除fgets读入的末尾换行符 if (name_len > 0 && filename[name_len - 1] == '\n') { filename[name_len - 1] = '\0'; }- 替换所有
==的字符串判断为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); }- 补充文件打开校验逻辑,避免空指针访问:
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
相关产品推荐
相关产品推荐

