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

如何通过命令行参数让C程序仅读取非连续重复行?

修改C程序alter.c实现仅删除连续重复行的功能

没问题,我来帮你搞定这个需求!你需要修改现有的alter.c,让它不再把文件所有行一股脑读入字符数组,而是只保留非连续重复的行——也就是仅删除紧跟在前的完全重复行,非连续出现的重复行依然保留。比如你说的testfile.txt里连续三个Hi there加一个Hello,处理后字符数组里只会留下Hi there和Hello这两行,连续重复的后两行会被自动剔除。

核心实现思路

要做到这点,关键就是在读取每一行的时候,和上一行的内容做对比:

  • 用一个变量存上一行的内容,每次读新行后先和它比对
  • 如果和上一行完全一样,就跳过这行不加入结果数组
  • 如果不一样,就把这行加入数组,同时更新“上一行”的内容为当前行

具体代码修改示例

假设你原来的代码是用getline读取所有行到数组a,那可以改成下面这样:

修改后的核心读取逻辑

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

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
        return 1;
    }

    FILE *fp = fopen(argv[1], "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    char **a = NULL;       // 存储最终结果的字符数组
    int line_count = 0;    // 结果数组的行数
    char *line = NULL;     // 临时存储当前读取的行
    size_t len = 0;        // getline用的缓冲区长度
    ssize_t read;          // getline返回的读取字节数
    char *prev_line = NULL;// 存储上一行的内容

    while ((read = getline(&line, &len, fp)) != -1) {
        // 可选:去掉行尾的换行符(如果需要忽略换行符判断重复的话)
        if (read > 0 && line[read - 1] == '\n') {
            line[read - 1] = '\0';
            read--;
        }

        int is_continuous_duplicate = 0;
        // 和上一行对比,判断是否是连续重复行
        if (prev_line != NULL && strcmp(line, prev_line) == 0) {
            is_continuous_duplicate = 1;
        }

        if (!is_continuous_duplicate) {
            // 不是连续重复行,加入结果数组
            a = realloc(a, (line_count + 1) * sizeof(char *));
            if (a == NULL) {
                perror("Failed to reallocate memory");
                // 这里要记得先释放已分配的内存再退出
                for (int i = 0; i < line_count; i++) free(a[i]);
                free(a);
                free(line);
                free(prev_line);
                fclose(fp);
                return 1;
            }
            a[line_count++] = strdup(line);

            // 更新上一行内容:先释放旧的,再复制新的
            free(prev_line);
            prev_line = strdup(line);
        }
    }

    // 释放所有分配的资源
    free(line);
    free(prev_line);
    fclose(fp);

    // 这里可以加代码验证结果,比如打印数组内容
    for (int i = 0; i < line_count; i++) {
        printf("%s\n", a[i]);
        free(a[i]);
    }
    free(a);

    return 0;
}

注意事项

  • 换行符处理:上面的代码会去掉行尾的换行符再对比,如果你需要严格匹配包括换行符在内的所有字符,把那段去掉换行符的代码删掉就行。
  • 内存安全:每次更新prev_line时都要先释放旧内存,避免内存泄漏;realloc失败时要做好错误处理,释放已分配的资源再退出。
  • 空行兼容:如果文件里有连续的空行,这段代码也会只保留一个,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:12