-2

タイトルにあるように、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

2つのファイルがテキストファイルの場合、正直なところ、getc()ではなくfgets()を使用し、文字ごとではなくstrcmp()を使用して行ごとに比較する、はるかに単純なプログラムから始めます。そのままのコードにはエラーが多すぎます。持っているものを破棄して、より単純なソリューションからやり直すと、タスクをより迅速に完了できます。

ちなみに、strcmpは、2つの文字列が同じ場合はゼロを返し、異なる場合はゼロ以外を返します。

于 2013-03-16T23:36:49.887 に答える
1

ループの初期化部分にある2つのforループgetcでは、文字c1を一度入れてから、ポインタの制限を超えて通過するc2までループを実行します。行の最初の文字が '\n' でない限り、 が満たされないため、セグメンテーション違反エラーが発生する可能性があります。s1s2p1p2c1 != '\n'

少なくともgccと私のシステムではwhile、遅延評価を行い(編集:遅延ではなく短絡評価、コメントを参照)c2 = getc(fp2)、他の部分が真の場合、その部分は実行されません。

また、各行の後にp1andをリセットしません。p2

strcmp両方の文字列が等しい場合は 0 を返し、C では 0 が false でゼロ以外が true であるため、最初の一致で終了します。

これはあなたのコードのほとんど機能しないバージョンです。まだそれに取り組んで、1 つのファイルが他のファイルよりも短い、ファイル内の 1 行が 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;
}
于 2013-03-16T22:35:06.597 に答える