-2

正如标题所说,我需要比较 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;
}
4

2 回答 2

2

如果这两个文件是文本文件,那么老实说,我会从头开始使用一个更简单的程序,该程序使用 fgets() 而不是 getc() 并使用 strcmp() 而不是逐个字符逐行比较。代码中的错误太多了 - 如果您放弃现有的内容并使用更简单的解决方案重新开始,您将更快地完成任务。

顺便说一句,如果两个字符串相同,strcmp 返回零,如果它们不同,则返回非零。

于 2013-03-16T23:36:49.887 回答
1

在两个for循环上,你有循环getc的初始化部分,它会将一个字符放入c1andc2一次,然后执行循环,直到你超出s1s2通过你的p1p2指针的限制。因为c1 != '\n'除非你在行中的第一个字符是'\n',否则永远不会遇到它可能会引发分段错误错误。

在 上while,至少在 gcc 和我的系统上,它会进行惰性评估(编辑:不是惰性而是短路评估,请参阅评论),c2 = getc(fp2)如果另一部分为真,则不执行该部分。

您也不会在每一行之后重置p1和。p2

strcmp如果两个字符串相等,则返回 0,在 C 中,0 为假,非零为真,因此您将在第一次匹配时退出。

这是您的代码的一个几乎无法运行的版本,您仍然需要对其进行处理并考虑到一个文件比另一个文件短,文件中的一行大于 1000 个字符(因为它现在会溢出)s1s2) 等。

#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;
}
于 2013-03-16T22:35:06.597 回答