我正在做一些带有结构的工作,由于某种原因,当我尝试运行程序时遇到了段错误。如果我删除了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()
创建字符串的新副本。