c程序未按预期输出

时间:2013-05-06 05:22:51

标签: c struct heap stdin

所以我有这个程序,我从第一个c首先放在一起。它来自第6章 - 数据结构章节......我的问题是输出显示所有先前列出的条目以及最后输入的标准输入名称。因此,一旦程序打印所有内容几乎两次就显示所有内容。我很难描述。如果您只是将其复制并粘贴到计算机上的文本编辑器中并运行代码,您将看到我的意思。

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

如果我将代码更改为显示(下一个),它会更接近我的预期,但它仍会打印出一个额外的空白行,并且可能存在内存泄漏

这个代码几乎是我的头脑,有人可以弄清楚为什么这样打印?

我会在头部第一个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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

学习如何创建有用的诊断信息是一种有价值的技术;其中一个关键点是确保输出线以换行符结束,这样你就可以看到打印出现的时间,而不是以后的某些不确定时间。另一个关键点是打印输入,以便您知道代码正在处理什么,而不是认为您知道代码正在处理什么。在每次迭代时打印完整列表也有助于确保正确构建列表。您可以在SO上找到未正确构建列表的示例(例如First address of struct)。如果每次迭代都打印完整的列表,那么问题会更加明显。

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

答案 1 :(得分:0)

  

&#34;我的问题是输出显示以前列出的所有条目为   以及最后输入的标准输入名称。&#34;

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

顺便告诉我们您的问题,但您没有告诉我们您的计划应该做什么