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

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;
}

修复点说明

  1. 输出所有有效行:将打印语句移到注释判断分支外,确保只要行内容非空就会输出,不再遗漏无注释的行。
  2. 正确截断注释:直接将找到的#位置赋值为'\0',这是C语言截断字符串的标准做法,简洁高效。
  3. 统一换行处理:用strcspn提前移除原行的换行符,保证输出格式整齐,避免出现无换行或多余空行的情况。
  4. 补全必要头文件:原代码使用exit但未包含<stdlib.h>,补上后消除编译警告。

最终输出结果

运行修复后的代码,终端会输出:

4, 2 
1 
7 
endNode 
endNet

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:48:11