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

C语言读取文本文件时如何忽略注释行?(编程作业场景)

解决C语言读取文件时忽略注释行的问题

嘿,我之前做类似的模拟计算机作业时也碰到过这个问题!其实核心思路很简单:读取每一行后,把//及其后面的内容全部截断,只处理前面的有效指令部分。下面给你一个实用的代码实现思路,结合你的输入文件示例来解释:

首先,先看针对你的场景的代码片段:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 修剪字符串前后的空白字符
char* trim_whitespace(char* str) {
    // 跳过开头空白
    while (isspace((unsigned char)*str)) str++;
    if (*str == 0) return str;
    // 定位结尾空白
    char* end = str + strlen(str) - 1;
    while (end > str && isspace((unsigned char)*end)) end--;
    // 添加结束符
    *(end + 1) = '\0';
    return str;
}

int main() {
    FILE* file = fopen("input.txt", "r");
    if (!file) {
        perror("无法打开文件");
        return 1;
    }

    char line[256]; // 假设每行不会太长,可根据需求调整大小
    while (fgets(line, sizeof(line), file) != NULL) {
        // 第一步:找到//的位置,截断注释
        char* comment_start = strchr(line, '/');
        if (comment_start != NULL && *(comment_start + 1) == '/') {
            *comment_start = '\0'; // 把//开头设为字符串结束符,截断注释
        }

        // 第二步:修剪前后空白,跳过空行或全注释行
        char* trimmed_line = trim_whitespace(line);
        if (strlen(trimmed_line) == 0) {
            continue; // 跳过无有效内容的行
        }

        // 第三步:解析并处理有效指令(这里用打印示例,你可以替换成自己的指令逻辑)
        int op, addr;
        if (sscanf(trimmed_line, "%d %d", &op, &addr) == 2) {
            printf("操作指令:%d,地址:%d\n", op, addr);
            // 这里可以加入你的指令执行逻辑,比如存入模拟内存、执行对应操作等
        } else {
            // 可选:处理格式错误的行
            fprintf(stderr, "无效的指令行:%s\n", trimmed_line);
        }
    }

    fclose(file);
    return 0;
}

关键步骤解释:

  • 整行读取:用fgets()一次性读取一行,比逐个字符读取更高效,也能完整保留每行的结构。
  • 截断注释:用strchr()查找第一个/,如果后面紧跟着第二个/,就把这个位置设为字符串结束符,直接忽略后面的注释内容。
  • 修剪空白:有些行可能在注释前有多余空格,或者整行都是注释+空白,trim_whitespace()函数会清理这些无用内容,避免处理空行。
  • 指令解析:用sscanf()从处理后的有效行里提取操作指令和地址,完美匹配你输入文件的格式。

针对你给出的输入文件,这段代码会输出:

操作指令:5,地址:5
操作指令:5,地址:6
操作指令:7,地址:3
操作指令:5,地址:5
操作指令:5,地址:6
操作指令:7,地址:3
操作指令:1,地址:0
操作指令:4,地址:1
操作指令:3,地址:0
操作指令:6,地址:7
操作指令:7,地址:1
操作指令:6,地址:7
操作指令:7,地址:7

额外提示:

  • 如果你的输入行可能超过256字符,可以调整line数组的大小,或者用动态分配内存的方式处理。
  • 如果后续需要支持/* ... */块注释,逻辑会复杂一些,但你的场景里只有//单行注释,上面的代码完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:28:50