我正在做一些带有结构的工作,由于某种原因,当我尝试运行程序时遇到了段错误。如果我删除了printfunction中的printf行,则程序可以顺利完成,但是重点是要打印出存储在list-> line中的内容。

addLine函数添加一个新的结构对象,将其放置在列表的末尾,并将其指向第一个结构对象。

应该使用printFunction打印出列表中的所有行。

结构:

typedef struct listoflines list;

struct listoflines {
    list* next;
    char* line;
};


addLine函数:

void addLine(list* firstline, char* linep) {
    list* newline = malloc(sizeof(list));
    newline->next = firstline;

    newline->line = malloc((sizeof(char) * strlen(linep) + 1));
    strcpy(newline->line, linep);

    list* currentline = firstline;

    while(currentline->next){
        if(currentline->next == firstline){
            currentline->next = newline;
            return;
        }
        else {
            currentline = currentline->next;
        }
    }
    currentline->next = newline;
}


printFunction函数:

void printFunction(list* firstline){
    list* currentline = firstline;

    while(currentline->next != firstline){
        printf("%s\n", currentline->line);
        currentline = currentline->next;
    }
}


addLine函数已经运行了4次,并且printFunction被赋予了指向与addline函数相同的“第一行”的指针。
任何帮助都非常有用。在这一点上,我不知道有什么问题。

最佳答案

由于要用全零初始化firstline,因此在while循环的第一次迭代中,currentline->line将为NULL,并且在打印该行时会出现段错误。您可以使用gdb轻松调试此类错误。

list* currentline = firstline;

while(currentline->next != firstline){
    printf("%s\n", currentline->line); /* the string here will be NULL */
    currentline = currentline->next;
}


关于实现的一个小建议:可以使用这样的结构使程序更具可读性:

struct text {
    list *firstline;
    list *lastline;
}


然后创建该结构的一个实例,并将其传递而不是传递firstline。这样一来,文本中将没有任何行(firstline将为NULL)会更加明显。由于您已经维护了指向最后一行的指针,因此您也可以摆脱while中的addLine()循环。

另外,您可以使用strdup()中的string.h代替malloc()strcpy()创建字符串的新副本。

07-24 09:46
查看更多