将文件读入链接列表时出现分段错误

乔希

我正在使用一个函数,该函数返回一个指向文件中下一个单词的指针,以创建文件中唯一字符串的链接列表。我还没有到达需要为每个重复项增加计数的部分,因为在尝试打印列表中的字符串时遇到“分段错误(核心转储)”错误。现在,我猜测这与我没有正确处理文件末尾的NULL有关,但是我真的不知道该如何解决。非常感谢您在此问题上的任何帮助,并感谢您的宝贵时间。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define MAX_WORD_LEN 256    

struct list {
    int count;
    char string[MAX_WORD_LEN];
    struct list *next;
};

char* getNextWord(FILE* fd) {
    char c;
    char wordBuffer[MAX_WORD_LEN];
    int putChar = 0;

    while((c = fgetc(fd)) != EOF) {
        if(isalnum(c)) break;
    }
    if (c == EOF) return NULL;

    wordBuffer[putChar++] = tolower(c);

    while((c = fgetc(fd)) != EOF) {
        if(isspace(c) || putChar >= MAX_WORD_LEN -1) break;

        if(isalnum(c)) {
            wordBuffer[putChar++] = tolower(c);
        }
    }
    wordBuffer[putChar] = '\0';
    return strdup(wordBuffer);
} 

int main() {

    char filename[50];
    printf("Enter the file name: \n");
    scanf("%s\n", filename);
    FILE *file = fopen(filename, "r");
    struct list *head, *tail, *curr; 
    head = NULL: 
    char *newWord;
    while((newWord = getNextWord(file)) != NULL) {

        strcpy(curr->string, newWord);
        free(newWord);
        if(head == NULL)
            head = curr; 
        else
            tail->next = curr;
        tail = curr;
        tail->next = NULL;
    }
    fclose(file);
    for(curr = head; curr != NULL; curr = curr->next) {
        printf("%s\n", curr->string);
    }

    return 0;

}

杰瑞

请仔细阅读以下代码段:

struct list *head, *tail, *curr; 
head = NULL: 
char *newWord;
while((newWord = getNextWord(file)) != NULL) {

    strcpy(curr->string, newWord);

您正在访问指向的对象的成员curr,但是那是什么对象?它从未被初始化,很可能是您对段错误进行的首次访问。要解决此问题,请通过以下方式每次将其设置为新节点:

struct list *head, *tail, *curr; 
head = NULL;
char *newWord;
while((newWord = getNextWord(file)) != NULL) {
    curr = malloc(sizeof(struct list));
    strcpy(curr->string, newWord);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章