为何printf无输出?文件名转.c后缀时打印为空问题排查
问题分析与修复
核心问题
你的代码存在指针偏移错误,最终printf时file_name指针指向了字符串的结束符'\0'位置,所以输出为空。
以输入hey.txt为例,错误流程拆解:
- 初始
file_name指向字符串首地址:h e y . t x t \0 - 循环查找
.:结束后file_name指向.的位置 *file_name++ == '.':先判断.,随后file_name移动到t的位置*file_name++ = 'c':把t改成c,file_name再移动到x的位置*file_name = '\0':把x改成结束符,此时file_name刚好指向这个结束符- 最后
printf("%s", file_name):从结束符位置开始输出,自然为空
同时还有隐藏问题:用移动后的file_name调用fopen,实际打开的是空字符串对应的文件,根本不是预期的hey.c。
修复后的代码
需要保存原始指针的起始地址,修改后缀后用原始指针输出和打开文件:
#include <stdbool.h> #include <stdio.h> bool file_genEquiCFile(char *file_name) { printf("file_name before change: %s\n", file_name); // 保存文件名的原始起始地址 char *original_name = file_name; // 定位到后缀分隔符'.' while (*file_name != '\0' && *file_name != '.') file_name++; // 确认找到有效分隔符 if (*file_name == '.') { // 修改后缀为.c file_name++; *file_name = 'c'; *(file_name + 1) = '\0'; // 用原始指针打开目标文件并输出结果 FILE *c_file = fopen(original_name, "w"); if (c_file != NULL) { fclose(c_file); } printf("file_name after change: %s\n", original_name); return true; } else return false; }
额外优化点
- 改为查找字符串中的
.(若文件名含多个点,比如hey.test.txt,会保留前缀仅修改最后一段后缀) - 增加
fopen的空指针判断,避免文件打开失败引发崩溃 - 移除冗余的
file_name != NULL判断(调用函数时需保证传入有效指针,否则初始printf就会崩溃)
内容的提问来源于stack exchange,提问作者user21290559
相关产品推荐
相关产品推荐

