gpt4 book ai didi

c - fscanf 和链表的 char *

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:05 25 4
gpt4 key购买 nike

struct node {
...
char *name;
...
struct node *next;
};

在递归函数中:

head->name = (char *) malloc(sizeof(char));
if (fscanf(fp, "id\t%d\nname\t%s\nmobile\t%lld\n", &head->id, head->name, &head->mobile) > 0) {
printf("%s\n", head->name);

它存储正确的数据...假设...

鲁特维克

阿比纳夫

但是打印数据时...

printf("%d\t%s\t%lld\n", head->id, head->name, head->mobile);

1 鲁特维克 9876655433

2 ��nav 1234567789


让我们暂时搁置字符指针。代码与结构配合得很好

struct node {
...
char name[10];
...
struct node *next;

};

但当我取名为 [20] 时,它会影响 long long mobile 的值...为什么??

输出:

1 鲁特维克 9876655433

2 阿比纳夫 578692242758466

578692242758466 出乎意料。

最佳答案

您分配sizeof(char) 字节,这是一个字节,足够大以在字符串末尾放置一个空字节。您使用长度不受限制的 %s 阅读。

这是堆缓冲区溢出;它通常会导致不快乐。您需要决定要分配多少字节的数据(32、64、4096、其他一些数字),然后使用格式字符串,例如 %31s%63s%4095s 或任何将数据读入其中的内容。

不要忘记检查分配是否成功!

有些人会责备您强制转换 malloc()。如果您使用不接受未声明函数的模式进行编译,那么一般来说,转换没有什么大问题。

关于c - fscanf 和链表的 char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287542/

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