Как получить строки из двух массивов символов, чтобы проверить равенство между каждой из них - PullRequest
0 голосов
/ 12 января 2020

Я программирую для универа. В настоящее время у меня есть функция для моего потребительского потока, но проблема сейчас не устранена. Проблема в том, что вместо проверки равенства содержимого (arg-> lineF1 и arg-> lineF2) я хотел бы провести l oop через каждую из их строк (учитывая, что arg-> lineF1 и arg-> lineF2 являются массивом символов), и для проверки равенства строк я пробовал некоторые вещи, но они пока не работают.

Я должен указать, что решения, которые я нашел для этих проблем, не работали (попытка strtok завершилась неудачно, попытка зацикливания, но я не получал пустых строк).

void * fonctionConsummer(void * args){
    struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;


    //-----------------LINE BY LINE CHECKING------------------------------------
    void * fonctionConsummer(void * args){
    struct argumentThreadConsummer *arg = (struct argumentThreadConsummer *)args;


    //-----------------LINE BY LINE CHECKING------------------------------------
    int counter = 0;
    const char s[2] = "\n";
    char *lineF1;
    char *lineF2;
    lineF1 = strtok(arg->lineF1,s);
    lineF2 = strtok(arg->lineF2,s);
    while(lineF1 != NULL || lineF2 != NULL){
        printf("%d ", counter);
        printf("Line F1 %s\n" , lineF1); // Add the new line character here since it is removed from the lineF1ization process
        printf("Line F2 %s\n" , lineF2); // Add the new line character here since it is removed from the lineF1ization process
        counter++;
        lineF1 = strtok(NULL, s);
        lineF2 = strtok(NULL, s);
    }
    //---------------------------------------------------------------------------

    if(strcmp (arg->lineF1, arg->lineF2) == 0){
        printf("\nLes fichiers ont le meme contenu\n");
        pthread_exit(0);
    }
    printf("\nLes fichiers n'ont pas le meme contenu\n");
    pthread_exit(0);
}

Содержимое двух файлы:

content of my two files

вывод:

enter image description here

Дон Не понимаю, почему я получаю нулевое значение от F2 (во второй итерации)

Заранее спасибо за помощь, я новичок в C программировании.

Ответы [ 2 ]

2 голосов
/ 12 января 2020

strtok хранит данные об анализируемой строке в местоположении c, что означает, что вы можете использовать ее только для одной строки за раз. Если вы используете его одновременно для двух строк (как вы пытаетесь это сделать), второй вызов приведет к засорению информации из первого вызова. Вместо этого вы можете использовать strtok_r, но это все равно будет иметь дополнительную проблему - пустые строки (две последовательные новые строки) будут пропущены, поэтому ваши сравнения (неправильно?) Вернут совпадение, если входные данные отличаются пустыми строками. Вы можете избежать этой проблемы (а также повторного входа), используя вместо этого strsep:

char *lineF1, *saveF1 = arg->lineF1;
char *lineF2, *saveF2 = arg->lineF2;
lineF1 = strsep(&saveF1, s);
lineF2 = strsep(&saveF2, s);
while(lineF1 != NULL || lineF2 != NULL){
    :
    lineF1 = strsep(&saveF1, s);
    lineF2 = strsep(&saveF2, s);
}

, если ваша система не имеет strsep (это BSD / GNU lib c speci c функция), вы можете определить его самостоятельно как:

char *strsep(char **str, const char *delim) {
    char *rv = *str;
    if (rv) {
        *str += strcspn(rv, delim);
        if (**str)
            *(*str)++ = '\0';
        else
            *str = 0; }
    return rv;
}   
0 голосов
/ 12 января 2020

Если вы хотите проверить, являются ли два файла идентичными, как я понял из вашего утверждения, вы можете использовать отображенные в памяти файлы, вот ссылка на некоторую информацию об этом: http://man7.org/linux/man-pages/man2/mmap.2.html. Для этого он помещает содержимое вашего файла в память, и вы можете получить доступ к содержимому файла при доступе к буферу.

...