微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在用 C 制作一个字符串链表,但遇到了问题

如何解决我正在用 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 举报,一经查实,本站将立刻删除。