如何解决我正在用 C 制作一个字符串链表,但遇到了问题
我是编程初学者。谢谢你帮助我。
我正在尝试在字符串中创建一个链表。 输入是字符串,如果输入是“退出”,则结束。 但是当我编译它时,它只打印出最后的输入,我无法解决它! 从函数addrear,区分数据是否第一次存储在链表中。并将数据和链接适当地存储到另一个节点。 从函数printlist开始,它从链表的开头开始,打印出每个节点中的数据。
我用整数类型尝试过,当这段代码用 int 而不是字符串执行时,它工作正常,所以我认为错误来自字符数组。
ex) input1 "dump",
input2 "结束",
input3 "目录",
input4 "退出",
比输出将是
转储, 结尾, 目录, 退出
但它出来了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char instruction[1000];
struct Node {
struct Node* next;
char* data;
};
struct Node* pStart = NULL;
struct Node* pEnd = NULL;
void addrear(char* val)
{
struct Node* Current;
Current = (struct Node*)malloc(sizeof(struct Node));
Current->data = val;
Current->next = NULL;
//printf("%s\n",Current->data);
if (pStart == NULL)
{
pStart = Current;
pEnd = Current;
}
else
{
pEnd->next = Current;
pEnd = Current;
}
}
void printlist(struct Node* Current)
{
Current = pStart;
while (Current != NULL)
{
printf("%s\n",Current->data);
Current = Current->next;
}
}
int main()
{
int i;
while (1)
{
printf("sicsim> ");
fgets(instruction,sizeof(instruction),stdin);
instruction[strlen(instruction) - 1] = '\0';
addrear(instruction);
if (strcmp(instruction,"exit") == 0)
{
break;
}
}
printlist(pStart);
}
解决方法
你的错误是你在节点结构中存储了一个指向指令缓冲区的指针。每次读取字符串时,都会用读取的字符串覆盖该缓冲区。
您需要为每个字符串分配内存。
如果您正在学习 C++,请查看“new”文档(您应该如何为 Node 等分配空间) malloc 是一种较低级别的 C 处理方法。
,正如 MZB 回答的那样,您的问题是您混淆了参考和价值。
你说: “我用 integer 类型尝试过,当这段代码用 int 而不是 string 执行时,它工作正常,所以我认为错误来自字符数组。”
分配 int
的值和分配字符串之间存在巨大差异。无论如何,您将获得此 int
的价值 - 您不在乎他“住”在哪里。当我们谈论 char
时也是如此,但是如果你谈论字符串——你想指向到这个字符串——所以你想指向某个可以保存你的数据和不会被修改。
如果你想保存这个字符串,你需要知道字符串的存储位置是不会被访问的。
因此,您应该逐个字符地复制一个字符,这样您就不会关心“指令”是否会被分配为其他内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。