在字符数组上使用printf会返回垃圾和字符串

时间:2012-11-11 22:19:55

标签: 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);

person是一个包含3个char变量的typedef结构:first_name [64],last_name [64],pes_nbr [64]。

输出如下:

  

F÷rnamn:约翰   ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠   ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠   ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠John

是什么导致这种情况,以及如何在将来避免这种情况?

编辑: 填充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);
}

编辑2: 自己弄清楚了。我必须编辑get_person函数并删除per_son结构并将strcpy更改为pers而不是pers_son。

3 个答案:

答案 0 :(得分:1)

你应该使用被传递的人 - 而不是当地人:

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);
}

答案 1 :(得分:0)

person dequeue_person;person per_son;是两个不同的对象。 你把名字放在一个但打印另一个,所以它仍然是垃圾。

当您创建person对象时,所有成员都未初始化,因此它是垃圾值。 当你尝试打印它时,它会在堆栈上打印垃圾值。你得到这个。

编辑:正在编辑问题

get_person(point_person, 9);

调用get_person()后,它将执行get_person()函数的代码。 因此,存在本地per_son对象,因此您放置的任何名称实际上都是本地名称,并且在退出get_person()后将自动销毁。 在那里打印first_name本身是个好主意,但是在调用环境中你还在做printf()还有一个错误,它会给你本地对象的first_name(即垃圾)。

如果您想传递person中的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)
{
    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_person()的指针指向在调用enviroment时创建的同一个对象。查看get_person()的实现

我希望你现在能得到它。

答案 2 :(得分:0)

结构的内容未初始化。你需要将它们设置为某种东西。

您可以像这样初始化您的结构:

struct person dequeue_person = { "joe", "blogs", "42" };

或者您可以创建一个空结构

struct person dequeue_person = { "", "", "" };

清除整个结构并不罕见:

struct person dequeue_person;
memset( &person, 0, sizeof(struct person) );

编辑....我注意到在垃圾输出的最后,出现了“John”这个词。可能是你的队列结束了吗? 元素QUEUE_MAX_SIZE-1。也许您没有正确初始化indexhead,或者您在错误的时间更改了它们的值。

或者可能index+head不是解决队列的正确方法。通常你会有headtail索引,你不会以这种方式添加它们。你在做什么意味着index实际上是队列中元素的数量。