C语言过滤文本文件注释后遍历文件异常问题求助
代码问题修复:过滤注释并完整输出内容
问题根源
你的代码存在两个关键问题导致输出不完整:
- 仅打印包含
#的行,无注释的行(比如1、7、endNode)直接被跳过,完全没输出。 - 注释截断方式错误:
memset(comment, '\\0', len)是往内存填充字符0,而非C语言中用于终止字符串的空字符'\0',无法真正截断注释内容。
修复后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // exit函数需要该头文件 #define BUFF_SIZE 1024 #define COMMENT_MARKER '#' int main() { FILE *fp; char buffer[BUFF_SIZE]; if ((fp = fopen("F:\\PythonProjects\\C\\text.txt", "r")) == NULL) { perror("Error opening file"); exit(1); } while (fgets(buffer, BUFF_SIZE, fp) != NULL) { // 先移除原行末尾的换行符,避免格式混乱 buffer[strcspn(buffer, "\n")] = '\0'; // 查找注释标记位置 char *comment = strchr(buffer, COMMENT_MARKER); if (comment != NULL) { // 直接截断字符串,将#的位置设为空字符 *comment = '\0'; } // 跳过处理后为空的行(比如原全注释行) if (strlen(buffer) > 0) { printf("%s\n", buffer); } } fclose(fp); return 0; }
修复点说明
- 输出所有有效行:将打印语句移到注释判断分支外,确保只要行内容非空就会输出,不再遗漏无注释的行。
- 正确截断注释:直接将找到的
#位置赋值为'\0',这是C语言截断字符串的标准做法,简洁高效。 - 统一换行处理:用
strcspn提前移除原行的换行符,保证输出格式整齐,避免出现无换行或多余空行的情况。 - 补全必要头文件:原代码使用
exit但未包含<stdlib.h>,补上后消除编译警告。
最终输出结果
运行修复后的代码,终端会输出:
4, 2 1 7 endNode endNet
内容的提问来源于stack exchange,提问作者nerb
相关产品推荐
相关产品推荐

