正如标题所说,我需要比较2个文件。如果有一行,这两个文件之间不一样,打印该行(来自两个文件)。代码给出了一个不发送错误。我似乎无法在我的代码中找到错误。
#include <stdio.h>
#include <string.h>
#define MAX 1000
int main(int argc, char *argv[]) {
char c1, c2;
char s1[MAX], s2[MAX];
char *p1;
char *p2;
FILE *fp1;
FILE *fp2;
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "r");
p1 = s1;
p2 = s2;
if (argc != 3) {
printf("Wrong use of program \n ");
return -1;
}
if (fp1 == NULL || fp2 == NULL) {
printf("One or both of the files can't be used \n ");
return -1;
}
while ((c1 = getc(fp1)) != EOF || (c2 = getc(fp2)) != EOF) {
*p1 = c1;
*p2 = c2;
p1++;
p2++;
for (c1 = getc(fp1); c1 != '\n'; p1++) {
*p1 = c1;
}
*p1 = '\0';
for (c2 = getc(fp2); c2 != '\n'; p2++) {
*p2 = c2;
}
*p2 = '\0';
if (!(strcmp(s1, s2))) {
printf("%s \n ", s1);
printf("%s \n ", s2);
return 0;
}
}
return 0;
}
答案 0 :(得分:2)
如果两个文件都是文本文件,那么老实说,我会从头开始使用更简单的程序,使用fgets()而不是getc(),并使用strcmp()逐行比较,而不是逐个字符。代码中存在太多错误 - 如果丢弃所拥有的内容,您将更快地完成任务,并使用更简单的解决方案重新开始。
顺便说一句,如果两个字符串相同,则strcmp返回零,如果它们不同则返回非零值。
答案 1 :(得分:1)
在两个for
循环中,您在循环的初始化部分有getc
,它会在c1
和c2
中放置一个字符,然后执行循环直到超出s1
和s2
的限制,通过p1
和p2
指针。由于除非你的第一个字符是'\ n',否则永远不会遇到c1 != '\n'
,否则可能会引发分段错误。
在while
上,至少在gcc和我的系统上,它进行了延迟评估(编辑:不是懒惰但短路评估,请参阅注释),如果c2 = getc(fp2)
部分未执行另一部分是真的。
您也不会在每行后重置p1
和p2
。
strcmp
返回0,而在C中,0为false且非零为真,因此您将退出第一个匹配。
这是你的代码几乎无法运行的版本,你仍然需要对它进行处理,并考虑到一个文件比另一个文件短的情况,文件中的一行大于1000个字符(就像现在一样)它会溢出s1
或s2
)等。
#include <stdio.h>
#include <string.h>
#define MAX 1000
int main(int argc, char *argv[]) {
char c1, c2;
char s1[MAX], s2[MAX];
char *p1;
char *p2;
FILE *fp1;
FILE *fp2;
p1 = s1;
p2 = s2;
if (argc != 3) {
printf("Wrong use of program \n ");
return -1;
}
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "r");
if (fp1 == NULL || fp2 == NULL) {
printf("One or both of the files can't be used \n ");
return -1;
}
c1 = getc(fp1);
c2 = getc(fp2);
while ((c1 != EOF) && (c2 != EOF)) {
for (; c1 != '\n'; p1++) {
*p1 = c1;
c1 = getc(fp1);
}
*p1 = '\0';
for (; c2 != '\n'; p2++) {
*p2 = c2;
c2 = getc(fp2);
}
*p2 = '\0';
if ((strcmp(s1, s2)) != 0) {
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
c1 = getc(fp1);
c2 = getc(fp2);
p1 = s1;
p2 = s2;
}
if (c1 != EOF || c2 != EOF)
printf("One of the files ended prematurely\n");
return 0;
}