如何通过命令行参数让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
相关产品推荐
相关产品推荐

