Дополнительный разрыв строки при чтении из файла в двоичное дерево поиска

У меня есть назначение в C, где я делаю двоичное дерево поиска слов, которые я читаю из файла.
Моя проблема в том, что есть некоторые новые строки, от которых мне не удается поймать и избавиться, поэтому они вставляются в мое двоичное дерево, и это выглядит странно, когда я его распечатываю. Это также приводит к тому, что некоторые слова появляются несколько раз, так как "yellow \ n" отличается от "yellow" при использовании strcasecmp.

У кого-нибудь есть предложения относительно того, что я делаю неправильно?

Вывод из бинарного дерева поиска (не должно быть лишних \ n в середине! Также нет двойного с, где заканчивается конец строки в файле, из которого я читал)):

использование
Используемый
было

что бы ни
с
с

** РЕДАКТИРОВАТЬ ** Добавлено чтение файла. Я использую fgets

typedef struct node {
    char word[64];
    struct node *left;
    struct node *right;
} Tree;

Tree* createTree(char *word){
    Tree* current = root;
    current = malloc(sizeof(Tree));
    strcpy(current->word, word);
    current->left = NULL;
    current->right = NULL;
    return current;
}

void insertBranch(char* word){
    Tree *parent = NULL, *current = root, *newBranch = NULL;
    int res = 0;

    if (root == NULL) {
        if(word[sizeof(word) - 1] == '\n')
            word[sizeof(word) - 1] = '\0';
        root = createTree(word);
        return;
    }
    for(current = root; current != NULL; current = (res > 0) ? current->right : current->left){
        res = strcasecmp(current->word, word);

        if(res == 0)
            return;
        parent = current;
    }
    newBranch = createTree(word);
    res > 0 ? (parent->right = newBranch) : (parent->left = newBranch);
    return;
}

void readFile(char* chrptr){
    char buffer[200];
    FILE *file = fopen(chrptr, "r");

    if(file == NULL){
        printf("Error opening file\n");
        return;
    }
    char *p, *newStr;   
    while((p = fgets(buffer, sizeof(buffer), file)) != NULL){
        newStr = strtok(p, "\",.-<>/;_?!(){}[]:= ");

        while(newStr != NULL){

            insertBranch(newStr);
            newStr = strtok(NULL, "\",.-<>/;_?!(){}[]:= ");
        }
    }
    fclose(file);
}

1 ответ

Решение

Поскольку \n это действовать как разделитель, а не часть слова, добавить \n к разделителю списка.

const char *delims = "\",.-<>/;_?!(){}[]:= \n";  // added \n
char *p, *newStr;   
while((p = fgets(buffer, sizeof(buffer), file)) != NULL){
    newStr = strtok(p, delims);
    while(newStr != NULL){
        insertBranch(newStr);
        newStr = strtok(NULL, delims);
    }
}
Другие вопросы по тегам