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

如何从指定文件中移除#注释及:once:标记并逐行输出内容?

完善C代码实现移除:once:标记和注释

我来帮你搞定这段代码,实现移除每行的:once:前缀和#后的注释功能。咱们一步步拆解修改:

先明确核心需求:

  • 去掉每行开头的:once:标记
  • 删除#及其后面的所有注释内容
  • 保留有效内容并正常逐行打印

完善后的完整代码:

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

int main(int argc, char **argv) {
    // 检查命令行参数是否正确传入文件名
    if (argc != 2) {
        fprintf(stderr, "用法:%s <文件名>\n", argv[0]);
        return EXIT_FAILURE;
    }

    FILE *file = fopen(argv[1], "r");
    // 处理文件打开失败的情况
    if (!file) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }

    char buf[100];
    char *p;
    while (fgets(buf, sizeof(buf), file)) {
        // 第一步:移除`:once:`标记
        p = strstr(buf, ":once:");
        if (p) {
            // 将`:once:`后面的内容移到字符串开头
            memmove(buf, p + 6, strlen(p + 6) + 1);
        }

        // 第二步:移除#注释
        p = strchr(buf, '#');
        if (p) {
            *p = '\0'; // 截断字符串,丢弃注释部分
        }

        // 打印处理后的内容(fgets已包含换行符,无需额外加\n)
        printf("%s", buf);
    }

    fclose(file);
    return EXIT_SUCCESS;
}

关键修改说明:

  1. 参数与文件校验:增加了命令行参数检查和文件打开失败的错误处理,避免程序因非法输入崩溃
  2. :once:标记处理:用strstr定位标记位置,再通过memmove把标记后的内容移到字符串开头,确保有效内容保留
  3. 注释处理优化:原代码的char p;类型错误,改成char *p;才符合strchr的返回值类型
  4. 打印逻辑调整:原代码的printf("%s\n", buf)会导致重复换行(fgets已读取每行的换行符),改成printf("%s", buf)更合理

测试效果:

输入行:once:echo Hello # this is a comment处理后输出echo Hello ;输入行:once:echo 3处理后输出echo 3,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:52:52