我有一个模拟文本编辑器的程序。它允许用户以他们选择的任何特定方式向列表添加文本行,具体取决于他们发送的命令。
其中一个功能允许用户在列表中向后移动以查看他们的行(还有一个让他们向前移动,但那个没有问题)。
还有一些功能可以让用户插入或附加文本。 Insert在当前行之前放置了行,而append在之后设置了它。我遇到的一个问题是插入文本的方式。
用户点击i
进行插入,通过标准输入(stdin
)输入文本,然后点击CTRL + D
(在Linux环境中)模拟NULL并返回命令模式。之后,如果你去浏览列表,它似乎进入列表顶部的最后一行,一切都跟着向后。有一次,我插入了4行文本,它在最后2行中进行了无限循环,并破坏了文本文件。
我认为它与链接列表的逻辑有关,但我很难想象它们。以下是有问题的功能:
void insert_line(char *t)
{
/* Allocate and clear (i.e. set all to 0) */
struct line *new_line = calloc(1, sizeof(struct line));
new_line->text = t;
if(current_line == NULL)
head = current_line = new_line;
else
{
new_line->prev = current_line->prev;
new_line->next = current_line;
current_line->next = new_line;
current_line = new_line;
if(current_line->prev == NULL)
head = current_line;
}
}
这必须非常糟糕 - 它无限循环文本的方式总是将文本放在后面。这就是我使用insert
函数的方式:
else if(command[0] == 'i')
{
char * line;
while((line = get_line(stdin)) != NULL)
insert_line(line);
}
get_line
一次读取一行文本并返回,直到达到EOF。我知道get_line
函数正在运行,因为我的导师为我们编写了它以供使用。
//
// Function: previous_line
// Moves the current_line pointer to the previous node, if any, in the linked-list.
//
void previous_line(void)
{
if(current_line == NULL)
printf("Error: No Lines Exist.\n");
else if(current_line->prev != NULL) {
current_line = current_line->prev;
printf("%s\n", current_line->text);
}
else
printf("Error: Already beginning-of-line.\n");
}
这个很奇怪,当我在文本中间附加文本时,next_line
函数工作正常,但是当我运行它以返回列表时,它没有显示我添加的内容
答案 0 :(得分:1)
在纸上画画(每行一个方框,下一个和上一个箭头)
这个位有问题 - 绘制时应该相当清楚。
new_line->prev = current_line->prev;
new_line->next = current_line;
current_line->next = new_line;
current_line = new_line;
答案 1 :(得分:0)
如果您尝试将换行符附加到文本文件中,则应该执行
new_line->prev = current_line;
current_line->next = new_line;
current_line = new_line;