C 对字符数组使用printf返回垃圾和字符串
我试图使用printf打印出指针point_person中的一个字符数组,当我使用它返回用户的名字时,它会打印出很多垃圾,最后是名字 代码看起来有点像这样:C 对字符数组使用printf返回垃圾和字符串,c,struct,printf,typedef,C,Struct,Printf,Typedef,我试图使用printf打印出指针point_person中的一个字符数组,当我使用它返回用户的名字时,它会打印出很多垃圾,最后是名字 代码看起来有点像这样: person dequeue_person; person *point_person = &dequeue_person; get_person(point_person, 9); printf("%s", point_person->first_name); void get_person
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
person per_son;
strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
pers = &per_son;
printf("Förnamn: %s\n", per_son.first_name);
}
struct person dequeue_person = { "joe", "blogs", "42" };
person是一个typedef结构,包含3个字符变量:first_name[64]、last_name[64]、pes_nbr[64]
输出如下所示:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
person per_son;
strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
pers = &per_son;
printf("Förnamn: %s\n", per_son.first_name);
}
struct person dequeue_person = { "joe", "blogs", "42" };
约翰:约翰
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠约翰
这是什么原因造成的?我今后如何避免
编辑:
填充first_name的代码如下所示:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
person per_son;
strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
pers = &per_son;
printf("Förnamn: %s\n", per_son.first_name);
}
struct person dequeue_person = { "joe", "blogs", "42" };
编辑2:
我自己想出来的。我必须编辑get_person函数,删除peru-son结构,并将strcpy改为pers而不是pers-son代码>和
每人代码>是两个不同的对象。
你把名字放在其中一个,但打印另一个,所以它仍然是垃圾
创建person
的对象时,所有成员都未初始化,因此它是垃圾值。
当您尝试打印它时,它会打印堆栈上的垃圾值。因此您得到了这个结果
编辑:当问题被编辑时
get_person(point_person, 9);
调用get_person()
后,它将执行get_person()
函数的代码。
因此,这里有一个本地的peru_son
对象,所以无论您输入什么名称,实际上都是本地名称,在退出get_person()
在那里打印第一个\u名称本身是个好主意,但在调用环境中执行printf()
时仍然存在一个错误,这将为您提供本地对象的第一个\u名称(即垃圾)
如果要在get_person()
中传递person
,并在两个位置打印相同的姓名,请尝试以下操作:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(pers->.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
printf("In get person First name : %s\n", pers->first_name);
}
在这种情况下,传递到get\u person()
的指针指向在调用环境中创建的同一对象。请参阅get\u person()
我希望你现在就拿到了。person-dequeue\u-person代码>和每人代码>是两个不同的对象。
你把名字放在其中一个,但打印另一个,所以它仍然是垃圾
创建person
的对象时,所有成员都未初始化,因此它是垃圾值。
当您尝试打印它时,它会打印堆栈上的垃圾值。因此您得到了这个结果
编辑:当问题被编辑时
get_person(point_person, 9);
调用get_person()
后,它将执行get_person()
函数的代码。
因此,这里有一个本地的peru_son
对象,所以无论您输入什么名称,实际上都是本地名称,在退出get_person()
在那里打印第一个\u名称本身是个好主意,但在调用环境中执行printf()
时仍然存在一个错误,这将为您提供本地对象的第一个\u名称(即垃圾)
如果要在get_person()
中传递person
,并在两个位置打印相同的姓名,请尝试以下操作:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(pers->.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
printf("In get person First name : %s\n", pers->first_name);
}
在这种情况下,传递到get\u person()
的指针指向在调用环境中创建的同一对象。请参阅get\u person()
我希望您现在就知道了。结构的内容尚未初始化。你需要让他们做点什么
您可以按如下方式初始化结构:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
person per_son;
strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
pers = &per_son;
printf("Förnamn: %s\n", per_son.first_name);
}
struct person dequeue_person = { "joe", "blogs", "42" };
也可以创建一个空结构
struct person dequeue_person = { "", "", "" };
清除整个结构并不少见:
struct person dequeue_person;
memset( &person, 0, sizeof(struct person) );
编辑。。。。我注意到在垃圾输出的最后,出现了“John”一词。这可能是你排队的终点吗?ie元素队列\u最大\u大小-1
。可能您没有正确初始化索引
和标题
,或者您在错误的时间更改了它们的值
或者可能是index+head
不是解决队列问题的正确方法。通常你会有一个头
和一个尾
索引,你不会以这种方式添加它们。您所做的操作意味着index
实际上是队列中的元素数。结构的内容未初始化。你需要让他们做点什么
您可以按如下方式初始化结构:
person dequeue_person;
person *point_person = &dequeue_person;
get_person(point_person, 9);
printf("%s", point_person->first_name);
void get_person(person *pers, int index)
{
person per_son;
strcpy(per_son.first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(per_son.last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(per_son.pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
pers = &per_son;
printf("Förnamn: %s\n", per_son.first_name);
}
struct person dequeue_person = { "joe", "blogs", "42" };
也可以创建一个空结构
struct person dequeue_person = { "", "", "" };
清除整个结构并不少见:
struct person dequeue_person;
memset( &person, 0, sizeof(struct person) );
编辑。。。。我注意到在垃圾输出的最后,出现了“John”一词。这可能是你排队的终点吗?ie元素队列\u最大\u大小-1
。可能您没有正确初始化索引
和标题
,或者您在错误的时间更改了它们的值
或者可能是index+head
不是解决队列问题的正确方法。通常你会有一个头
和一个尾
索引,你不会以这种方式添加它们。您所做的操作意味着index
实际上是队列中的元素数。您应该使用passed person,而不是local person:
void get_person(person *pers, int index)
{
// NOT NEEDED: person per_son;
strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(pers->last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
// WRONG: pers = &per_son;
printf("Förnamn: %s\n", pers->first_name);
}
您应该使用已通过的人员-而不是本地人员:
void get_person(person *pers, int index)
{
// NOT NEEDED: person per_son;
strcpy(pers->first_name, queue[(index+head)%QUEUE_MAX_SIZE].first_name);
strcpy(pers->last_name, queue[(index+head)%QUEUE_MAX_SIZE].last_name);
strcpy(pers->pers_nbr, queue[(index+head)%QUEUE_MAX_SIZE].pers_nbr);
// WRONG: pers = &per_son;
printf("Förnamn: %s\n", pers->first_name);
}
在发布的代码中,从不填充名字。你能发布填充它的代码吗?╠ 代码页中是否为0xCC