Функция C, чтобы найти линии, которые отличаются друг от друга - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь реализовать функцию, которая сравнивает два файла.Функция должна восстанавливать первые строки, которые отличаются друг от друга.Если файлы одинаковые, возвращается NULL.Функция заканчивается, как только заканчивается один из файлов, и затем возвращается NULL.Я думаю, что если мои функции не работают, и поэтому в этой функции не возвращаются строки.

Вот мой код:

char *difference(const char* file1, const char* file2)
{
    char line1[1000];
    char line2[1000];
    char *a = malloc(1000 * sizeof(char));

    FILE *f1 = fopen(file1, "r");
    FILE *f2 = fopen(file2, "r");
    if (!f1 || !f2) // checking if there is any error 
    {
        return -1; 
    }

    while (fgets(line1, sizeof(line1), file1) != NULL && fgets(line2, sizeof(line2), file1) != NULL)
{
    if (strcmp(line1, line2) != 0)
    {
        strcpy(a, line1);
        strcpy(a, line2);

    }
    else
    {
        return NULL;
    }
}

fclose(f1);
fclose(f2);
return a;

int main(void)

    char* diff = difference("testifile.c", "testifile2.c");
    printf("\n--- Difference:\n");
    printf("%s", diff);

    free(diff);

    return 0;
}

1 Ответ

0 голосов
/ 20 марта 2019

Да, это не так хорошо работает. Вот ошибки:

return -1;

Не компилируется. Вы имели в виду

return (char*)-1;

Кроме того, утечки памяти. Есть:

 if (f1) fclose(f1);
 if (f2) fclose(f2);
 return (char*)-1;

Упс, вы читаете из file1 дважды:

while (fgets(line1, sizeof(line1), file1) != NULL && fgets(line2, sizeof(line2), file1) != NULL)

должно быть

while (fgets(line1, sizeof(line1), file1) != NULL && fgets(line2, sizeof(line2), file2) != NULL)

Очистка памяти:

line3=strcat(line1,line2);

Должно быть:

strcat(strcpy(a,line1),line2);

Проверяет только первую строку, потому что ранний возврат:

else
{
    return NULL;
}

Просто удалите этот блок.

Упс забыл проверить на ошибки:

char* diff = difference("testifile.c", "testifile2.c");

char* diff = difference("testifile.c", "testifile2.c");
if (diff == (char *)-1) {
    /* handle file open error */
}
else if (diff == NULL) {
    /* handle no difference */
}
else {
     /* your message */
     free(diff);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...