2013-05-06 54 views
-3

所以我有这个程序,我把头从头放在一起c。它来自第6章 - 数据结构章节......我的问题是输出显示了所有以前列出的条目以及最后输入的标准输入名称。所以相反,当程序打印几乎所有东西时,显示一切打印出来我很难形容。如果你只是复制并粘贴到你的机器上的文本编辑器并运行代码,你会明白我的意思。c程序不按预期输出

这本书展示了使用<重定向工具获取岛名文件的程序。当我尝试这个时,它打印第一个名字的第二个名字和第一个名字。然后是下一个名字和第二个名字......然后是下一个名字和第三个,第二个和第一个名字......等,取决于有多少名字。在标准输入中的终端中输入文本时也会发生此行为。

如果我更改了代码说显示器(下)它的工作原理接近我所期望的,但它仍然打印出一个额外的空白行,有可能是内存泄漏

此代码是相当多了我的头可以找出为什么它是这样打印?

我会先问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); 
    } 
} 
+0

你需要做'display(i);'而不是'display(start);' – 2013-05-06 05:25:49

+0

...或者将'display()'移到循环之外。 – WhozCraig 2013-05-06 05:27:52

+0

我不能相信有人标记了这个问题。无论如何感谢迄今为止的帮助。 @WhozCraig如果我将display()从循环中移出,程序只是在那里进行输入,但实际上并没有显示任何内容...... – 2013-05-06 05:33:52

回答

1

什么代码工作,为设计(WAD)。它被设计为在每个条目被读取后打印完整列表 - 这就是display(start)在循环中所做的。您可以通过回显输入(printf("Read: %s", name);(格式中没有换行符,因为该名称仍包含换行符)或在012xx(或两者)调用之前用printf("Printing list:\n");标记显示)来帮助自己。如果您从名称中删除换行符,则需要调整“回显”操作。

学习如何创建有用的诊断消息是一种有价值的技术;其中一个关键点是确保输出行以换行符结束,因此您可以很好地看到打印的发生,而不是稍后的某个不确定时间。另一个关键点是打印输入,以便您知道代码的工作内容,而不是认为您知道代码的工作内容。在每次迭代中打印完整列表还有助于确保正确构建列表。您可以在SO上找到列表未正确构建的示例(例如First address of struct)。如果每次迭代都打印完整列表,问题就会更加明显。

因此,麻烦似乎是您的期望与代码设计的目标不符。

+0

如果我在main()的for循环中更改要显示(下一个)的代码,它只会打印上次输入的内容或使用<重定向的名称文件的全部内容。我的名字文件是一个名字,然后返回然后另一个岛名,等等,如果我移动显示(下一步)和释放(开始)到main()的for循环,我得到一个无限循环与第二个岛名打印到无穷.. – 2013-05-06 06:17:38

+0

我不认为这真的回答了什么,但我很沮丧,我赞赏@Jonathan – 2013-05-06 06:20:45

0

“我的问题是,输出显示所有以前列出的条目作为 以及最后输入的名称为标准输入。”

for(;i != NULL; i = i ->next) { 
     printf("Name: %s open: %s-%s\n", i->name, i->opens, i->closes); 

顺便说一下,你告诉我们你的问题,但你没有告诉我们,你的程序应该做

+0

已经在显示方法中有这样的代码...有没有人尝试复制和粘贴,然后在他们的机器上运行代码? – 2013-05-06 05:42:28

+0

有问题。我不需要复制粘贴你的代码。只要阅读它,拿一纸或任何东西,想想你写的是什么。在你的程序中有2个循环 – axzwl 2013-05-06 05:45:26

+0

答案没有回答任何问题... – 2013-05-06 06:11:02