向用户请求数据并将其存储在C中的结构中
在下面的代码中,我尝试使用printf和scanf从用户那里获取数据,并将它们存储在我定义的名为node的结构中 该程序在第一次提示时工作正常,但一旦用户输入名称,程序就会以打印年龄:工资: 有人能帮我吗 顺便说一句,有人能帮我理解如何创建一个循环来将数据存储在各个节点中并将它们存储在一起吗?(不是一个接一个地硬编码) 非常感谢向用户请求数据并将其存储在C中的结构中,c,pointers,struct,scanf,nodes,C,Pointers,Struct,Scanf,Nodes,在下面的代码中,我尝试使用printf和scanf从用户那里获取数据,并将它们存储在我定义的名为node的结构中 该程序在第一次提示时工作正常,但一旦用户输入名称,程序就会以打印年龄:工资: 有人能帮我吗 顺便说一句,有人能帮我理解如何创建一个循环来将数据存储在各个节点中并将它们存储在一起吗?(不是一个接一个地硬编码) 非常感谢 typedef struct node { char *name; int age; int salary; struct node *
typedef struct node
{
char *name;
int age;
int salary;
struct node * next;
}node;
int main(void)
{
node *tmp = malloc(sizeof(node));
printf("Name:");
scanf("%s", tmp->name);
printf("Age:");
scanf("%i", &(tmp->age));
printf("salary:");
scanf("%i", &(tmp->salary));
tmp->next = NULL;
free(tmp);
}
使用char[]作为名称,
例如:
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
char name[128];
int age;
int salary;
struct node * next;
}node;
int main(void)
{
node *tmp = malloc(sizeof(node));
printf("Name:");
scanf("%s", tmp->name);
printf("Age:");
scanf("%i", &(tmp->age));
printf("salary:");
scanf("%i", &(tmp->salary));
tmp->next = NULL;
free(tmp);
}
#包括
#包括
类型定义结构节点
{
字符名[128];
智力年龄;
国际工资;
结构节点*下一步;
}节点;
静态无效打印列表(节点*n)
{
while(n){
printf(“%s,%d,%d\n”,n->name,n->age,n->salary);
n=n->next;
}
}
静态节点*获取节点(无效){
节点*list=NULL;
而(42){
字符c;
node*tmp=malloc(sizeof(node));
printf(“名称:”);
scanf(“%s”,tmp->name);
printf(“年龄:”);
scanf(“%i”和(tmp->age));
printf(“工资:”);
scanf(“%i”和(tmp->salary));
tmp->next=列表;
列表=tmp;
printf(“继续是/否\N”);
scanf(“%c”、&c);
如果(c='N')
打破
}
退货清单;
}
静态无效清除列表(节点*节点){
如果(节点->下一步){
clearList(节点->下一步);
}
自由(节点);
}
内部主(空)
{
节点*列表=获取_节点();
打印列表(列表);
清除列表(列表);
返回0;
}
要修复bug,您应该分配char*的内存
第一种方法,当您创建结构时
typedef结构节点
{
char name[200];//指定char*可以保存200个字符
智力年龄;
国际工资;
结构节点*下一步;
}节点;
也可以创建init struct函数
node *init_node()
{
node *test = null;
test->name = malloc(sizeof(char) * 200);
test->age = 0;
test->salary = 0;
test->node = null;
return test
}
您正试图写入未初始化的内存
这是初学者面临的一个非常常见的问题
您正试图使用char*name
声明存储名称。
此处的名称未指向有效的内存位置,这就是为什么程序未按预期运行的原因
即使name
指向有效的内存地址,也必须分配足够的内存来存储数据
你可以用
#define BUFFER_SIZE 50
char name[BUFFER_SIZE];
您可以使用任意大小的缓冲区,然后在name
数组中存储长度为-1的字符串<代码>-1用于空终止字符
\0
使用此声明,您正在分配大小为BUFFER\u
字节的内存,name
指向该数组中的第一个字节
此分配发生在不在堆中的堆栈上
char*name代码>您需要分配内存来写入我在回答您的另一个问题时花费的精力。然后你没有给出反馈就删除了它。如果你经常这样做,人们可能会停止回答你的问题。所以我希望删除只是暂时的,直到你改进了这个问题。你完全误解了,我删除我的问题是因为我看到了你的评论,我意识到我在这个问题上搞得一团糟,所以我删除了它。对此我深表歉意,我不是有意的。非常感谢你在这个问题上的回答,但我仍然需要做一些事情来消化答案。我明白你在上半部分所说的,但下半部分的语法对我来说似乎很新,有什么我需要研究的主题吗?第二部分只是一个函数,你可以调用它并返回一个带有默认值的节点*
(0处的int变量,char*malloc,…)谢谢!!现在解决了,但是你能帮我一点忙吗?教我如何编写一些循环来从用户那里获取数据并将它们存储在链接列表中?非常感谢。对不起,我差点错过了你的答案,非常感谢,先生!谢谢!!现在解决了,但是你能教我如何编写一些循环来帮我一点忙吗要从用户那里获取数据并将其存储在链接列表中?非常感谢。很高兴为您提供帮助。问题:在收集数据结束时,您可以询问用户是否希望输入更多数据,然后使用scanf
,如果回答是n
,则返回。如果是y
,则使用分配一个新节点ode>tmp.next=malloc(sizeof(node))
然后tmp=tmp.next
,并将此代码放入while循环中。您还可以创建一个节点。previous
成员并将其指向previous节点。我确信在线上有很多文章和教程,您也可以使用它们来了解更多信息。需要一些时间来消化并尝试用代码编写,但无论如何,真的谢谢你的帮助!!:)
node *init_node()
{
node *test = null;
test->name = malloc(sizeof(char) * 200);
test->age = 0;
test->salary = 0;
test->node = null;
return test
}
#define BUFFER_SIZE 50
char name[BUFFER_SIZE];