1

printf を使用して、point_person というポインター内の文字の配列を出力しようとしています。それを使用してユーザーの名を返すと、大量のゴミが出力され、最後に名前が出力されます。

コードは次のようになります。

    person dequeue_person;
    person *point_person = &dequeue_person;
    get_person(point_person, 9);
    printf("%s", point_person->first_name);

person は、first_name[64]、last_name[64]、pes_nbr[64] の 3 つの char 変数を含む typedef 構造体です。

出力は次のようになります。

F÷rnamn: ジョン ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠ジョン

何が原因で、今後これを回避するにはどうすればよいですか?

編集: 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_son ではなく pers に変更する必要がありました。

4

3 に答える 3

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);
}
于 2012-11-11T23:55:17.933 に答える
0

person dequeue_person;person per_son;は 2 つの異なるオブジェクトです。あなたは名前を一方に入れていますが、もう一方は印刷しているので、まだゴミです。

すべてのメンバーのオブジェクトを作成するとperson、初期化されていないため、ガベージ値になります。印刷しようとすると、スタックにガベージ値が印刷されます。したがって、これを取得しています。

編集:質問が編集されると

get_person(point_person, 9);

呼び出した後、関数のコードget_person()を実行します。get_person()そのため、ローカルper_sonオブジェクトがあるため、実際に付けている名前は実際にはローカルのものであり、first_nameの出力を終了すると自動的に破棄されますが、呼び出し元の環境でget_person() 行っている間違いが1つありますprintf()これにより、ローカル オブジェクトの first_name (つまり、ガベージ) が得られます。

を渡し、両方の場所で同じ名前を出力したい場合は、これを試してくださいpersonget_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()、呼び出し環境で作成された同じオブジェクトを指しています。実装を参照してくださいget_person()

あなたが今それを手に入れたことを願っています。

于 2012-11-11T22:23:44.370 に答える
0

構造体の内容は初期化されていません。それらを何かに設定する必要があります。

次のように構造体を初期化できます。

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

または、空の構造を作成できます

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

構造体全体をクリアすることは珍しくありません。

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

編集....ガベージ出力の最後に、「ジョン」という単語が表示されていることに気付きました。これがあなたのキューの終わりである可能性がありますか? すなわち要素QUEUE_MAX_SIZE-1。おそらく、初期化が正しく行われていないindexhead、間違ったタイミングで値を変更しています。

index+headまたは、キューに対処する正しい方法ではない可能性があります。通常、headtailインデックスがあり、この方法でそれらを追加することはありません。あなたがしていることindexは、実際にはキュー内の要素の数であることを意味します。

于 2012-11-11T22:23:59.950 に答える