我试图实现一个包含字符串的堆栈,我觉得我现在非常接近 但我真的不知道为什么它不起作用
编辑: 那样的东西?我现在关门了吗?
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;
}
答案 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
。