一堆字符串

时间:2014-02-22 22:22:22

标签: c string stack

我试图实现一个包含字符串的堆栈,我觉得我现在非常接近 但我真的不知道为什么它不起作用

编辑: 那样的东西?我现在关门了吗?

int pop(char **x)
{
    if (isEmpty())
        return 0;
    else
    {
        struct Node *temp = head;
        *x = head->wyraz;
        head = head->next;
        free(temp);
        return 1;
    }
}


int main()
{
char buf[255];
char *str;
while (fgets(buf, sizeof(buf), stdin) != 0 && buf[0] != '\n')
{   

    push(buf); 
}



while (pop(&str) != 0)
{
    printf("%s\n", str);
    free(str);
}

return 0;
}

3 个答案:

答案 0 :(得分:2)

我看到的第一个主要问题是你只是将指针存储到堆栈中,并且总是设置为buf并且不断被覆盖。

你应该strdup字符串以确保每个节点获得一个唯一的缓冲区(并且在你弹出它之后的某个时刻记住它free。)

答案 1 :(得分:1)

insert()函数中,您不会复制字符串,因此在读取下一行时,它将覆盖前一个字符串。因此,堆栈中的所有项目将以与读取的最后一行相同的数据结束。您需要为字符串分配内存并将输入复制到分配的内存中。请记住允许尾随空值,以及fgets()将新行保留在读取的数据上这一事实。

使用fgets()返回指向的数组的第0个元素进行的测试将在EOF上崩溃。循环条件应为:

while (fgets(buf, sizeof(buf), stdin) != 0 && buf[0] != '\n')
{
    …

您应该测试通过反复弹出数据来打印推入堆栈的所有值,直到没有任何内容为止。请记住正确地释放数据。

您的pop()代码存在问题。您应该从编译器收到有关整数转换指针的警告。您可能需要使用:

int pop(char **x)
{
    if (isEmpty())
        return 0;
    else
    {
        struct Node *temp = head;
        *x = head->wyraz;
        head = head->next;
        free(temp);
        return 1;
    }
}

您必须像以下一样使用它:

char *str;

while (pop(&str) != 0)
{
    printf("[%s]\n", str);
    free(str);
}

答案 2 :(得分:1)

有几个问题:

  • 您始终使用相同的字符串缓冲区buf来执行insert
  • 您的pop函数有点困惑。我想您正在尝试返回指向堆栈顶部字符串的指针,在这种情况下,您需要传递char **x而不是char *x。然后用指针pop(&p)调用它。但是很难说出你的意图是什么。

顺便说一下,如果你想维护堆栈范例,我会将insert命名为push

相关问题