gpt4 book ai didi

字符串堆栈的 C 问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:33 25 4
gpt4 key购买 nike

所以我试图在 C 中创建一个字符串堆栈,但我似乎遇到了一个问题。目标是读取文件,然后反向打印。我认为堆栈是最合适的方法(我意识到有更简单的方法可以做到这一点,但我想通过使用结构来挑战自己)。

这是我的 push/printStack 代码:

void push(struct LineStack * stack, char * line)
{
if(!stack->head)
{
stack->head = malloc(sizeof(struct entry *));
stack->head->data = line;
stack->head->next = NULL;
stack->top = stack->head->data;
stack->size++;
}
else
{
struct entry * entry = malloc(sizeof(struct entry *));
entry->data = line;
entry->next = stack->head;
stack->head = entry;
stack->top = stack->head->data;
stack->size++;
}
}

void printStack(struct LineStack * stack)
{
while(stack->head)
{
printf("%s\n", stack->head->data);
stack->head = stack->head->next;
}
}

这里是 main/tempFile.txt:

int main(void)
{
struct LineStack * stack = newStack();
char * fileName = "tempFile.txt"
char line[SIZE];

FILE * fp = fopen(fileName, "r");

while(fgets(line, 128, fp) != NULL)
push(stack, line);

printStack(stack);

free(stack);

return 0;
}

临时文件.txt:

Lets begin
We'll say 2 + 2 = 4
But then go ahead and prove that 1 + 2 + 3 + 4 + ... = -1/12
How can this be?
How can this be?

当我尝试运行代码时,它打印出文件中正确的行数 (5),但只打印出“How can this be”。现在,我尝试使用 GDB 来查看问题所在,推送调用似乎正常工作。每次调用都会将不同的行放在不同的内存位置,因此我必须假设构成堆栈的链表运行良好。我是不是漏掉了一些愚蠢的小东西?

作为引用,这里是条目/LineStack 声明:

struct entry
{
char * data;
struct entry * next;
};

struct LineStack
{
struct entry * head;
char * top;
int size;
};

提前致谢。

最佳答案

您的 main() 将每一行读入本地数组 line。然后它将此数组(指向)传递给函数 push()。该函数只是将此指针存储在堆栈中——不复制数据,只复制指针。结果,所有堆栈条目都包含指向同一数组的指针;当您打印它们时,此数组包含从文件中读取的最后一行,这就是您打印的内容,与您读取行的次数一样多。

您需要复制输入的字符串。如果您有 strdup()(一个 POSIX 函数,但不是标准的 C 函数),那么这是制作此类副本的最简单方法。否则,[strlen() +] malloc() + strcpy() 将是制作字符串副本的常规方法。无论哪种方式,请记住,在使用完每 block 动态分配的内存后,您有责任释放它,然后再允许指向它的最后一个指针丢失。

关于字符串堆栈的 C 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41965284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com