【问题标题】:c program not outputting as expectedc程序没有按预期输出
【发布时间】: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


【解决方案1】:

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

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

因此,问题似乎在于您的期望与代码的设计目的不符。

【讨论】:

  • 如果我在 main() 的 for 循环中将代码更改为 display(next),它只会打印最后输入的内容或带有
  • 我认为这并不能真正回答任何问题,但我很沮丧,感谢@Jonathan 的帮助
【解决方案2】:

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

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

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

【讨论】:

  • 显示方法中已经有此代码...有人尝试复制和粘贴然后在他们的机器上运行代码吗?
  • 有问题。我不需要复制粘贴您的代码。只需阅读它,拿一张纸或其他任何东西,然后想想你写了什么。您的程序中有 2 个循环
  • @user2085446 虽然这可能是一个质量很低的帖子,但请考虑在未来以更具建设性的方式分享您的意见。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多