【发布时间】:2013-05-06 05:22:51
【问题描述】:
所以我有这个程序,我从头开始放在一起 c。它来自第 6 章 - 数据结构一章......我的问题是输出显示所有以前列出的条目以及最后输入的标准输入名称。因此,一旦程序几乎两次打印所有内容,就显示所有打印的内容。我很难描述。如果您只是将其复制并粘贴到您机器上的文本编辑器中并运行代码,您就会明白我的意思。
这本书展示了使用
如果我将代码更改为 display(next),它会更接近我的预期,但仍会打印出额外的空白行,并且可能存在内存泄漏
这段代码几乎让我头晕目眩,有人能弄清楚为什么会这样打印吗?
我会先询问 c 讨论板,但我想先询问 stackoverflow 并立即获得答案。
我的代码如下。如果您将其复制并粘贴到文本编辑器中,它不应看起来像一堵文本墙。
编码愉快。
#include <stdio.h> // basic input output
#include <stdlib.h> // for obtaining and releasing heap memory malloc and free...
#include <string.h> // for the stringdup method
typedef struct island {
char *name;
char *opens;
char *closes;
struct island *next;
} island;
void display(island *madonna);
island* create(char *name);
void release(island *start);
int main()
{
/* create islands */
island *start = NULL;
island *i = NULL;
island *next = NULL;
char name[80];
puts("enter island name...");
for(; fgets(name, 80, stdin) != NULL; i = next) {
next = create(name);
if(start == NULL)
start = next;
if (i != NULL)
i -> next = next;
display(start);
}
release(start);
}
// display method
void display(island *start)
{
island *i = start;
if (i == NULL)
puts("i equals NULL ");
for(;i != NULL; i = i ->next) {
printf("Name: %s open: %s-%s\n", i->name, i->opens, i->closes);
}
}
// create method
island* create(char *name)
{
island *i = malloc(sizeof(island));
i->name = strdup(name);
i->opens = "09:00";
i->closes = "17:00";
i->next = NULL;
return i;
}
// release method
void release(island *start)
{
island *i = start;
island *next = NULL;
for(; i != NULL; i = next) {
next = i-> next;
free(i->name); // must free this first because of strdup uses heap memory
free(i);
}
}
【问题讨论】:
-
你需要做
display(i);而不是display(start); -
...或将
display()移出循环。 -
我不敢相信有人标记了这个问题。无论如何,感谢到目前为止的帮助。 @WhozCraig 如果我将 display() 移出循环,程序只是坐在那里接受输入但实际上不显示任何内容......
-
@user2085446,否决票可能针对以下任何一项:1) 预期输入、预期输出和实际输出是多少? 2) 标题有点难以描述 3) 没有解释代码的用途/您尝试过的任何事情
-
@MrLister 谢谢你的帮助。我试过了,但它仍然没有按预期工作。第一次通过 i is NULL 打印,然后在随后的时间打印最后两个条目以及最新条目作为一个,以前的名称作为另一个打印
标签: c struct heap-memory stdin