首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fscanf和链接列表的字符*

fscanf和链接列表的字符*
EN

Stack Overflow用户
提问于 2013-03-08 05:47:22
回答 2查看 634关注 0票数 0
代码语言:javascript
复制
struct node {
        ...
        char *name;
        ...
        struct node *next;
};

在递归函数中:

代码语言:javascript
复制
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);

它存储正确的data...suppose..。

鲁特维克

阿希纳夫

但当打印数据..。

代码语言:javascript
复制
printf("%d\t%s\t%lld\n", head->id, head->name, head->mobile);

1鲁特维克9876655433

2��导航1234567789

让我们暂时把char指针放在一边。代码具有很好的结构

代码语言:javascript
复制
struct node {
...
char name[10];
...
struct node *next;

};

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

输出:

1鲁特维克9876655433

2 Abhinav 578692242758466

578692242758466是意想不到的。

EN

回答 2

Stack Overflow用户

发布于 2013-03-08 05:51:52

您分配sizeof(char)字节(即一个字节),足够大到字符串末尾的空字节。您使用的是不受长度限制的%s

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

别忘了检查分配是否成功!

有些人会因为你铸造malloc()而责备你。如果您的编译模式导致未声明的函数不被接受,那么一般的转换都没有什么问题。

票数 3
EN

Stack Overflow用户

发布于 2013-03-08 05:50:57

这一行:

代码语言:javascript
复制
head->name = (char *) malloc(sizeof(char));

只分配1字节内存。您需要确定最大大小并分配那么多字符:

代码语言:javascript
复制
head->name = (char *) malloc(sizeof(char) * MAXNAME);

那么,您最好将结构更改为:

代码语言:javascript
复制
struct node {
        ...
        char name[MAXNAME];
        ...
        struct node *next;
};

一个更好的选择是保持结构的原样,让MAXNAME大小的buffer从文件中读取,然后为名称分配足够的空间:

代码语言:javascript
复制
// + 1 for the null character at the end
head->name = (char *) malloc(sizeof(char) * (strlen(buffer) + 1)); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15287542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档