0

C初心者です。フォーラムを見回しましたが、必要なヘルプが得られないようです。私がやろうとしていることはとても簡単です。ヘッダーで構造体を宣言してから、この構造体の配列を作成しました。

次に、関数を呼び出して、この構造体の配列へのポインターを渡しますが、関数内でエラーが発生します。

エラー: 構造体または共用体ではないメンバー 'XXXXX' の要求

このエラーは、構造体の配列を関数に渡す方法だと思いますが、正しい方法を理解できないようです。

私の header.h は次のとおりです。

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

typedef struct PhoneNumber
{
    char name[40];
    unsigned char number[10];

} PhoneNumber;


#endif // HEADER_H_INCLUDED

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

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main()
{
struct PhoneNumber PhoneNumbers[10];

//input phone number
inputPhoneNumbers(&PhoneNumbers);

//display PhoneNumber
displayPhoneNumbers(&PhoneNumbers);

return EXIT_SUCCESS;
}



int inputPhoneNumbers(int size, PhoneNumber *details[size])
{
    size = 0;
    printf("Enter a name\n");
    scanf("%s\n", &details[size].name);
    printf("Enter %s's number\n", details[size]->name);
    scanf("%s\n", &details[size].number);



   return EXIT_SUCCESS;
}


int displayPhoneNumbers(PhoneNumber *number)
{
    printf("%s\n",number->name);
    printf(number->number);

}

誰かが私を正しい方向に向けることができますか?

乾杯!

4

3 に答える 3

3

表記は一貫している必要があります。あなたが持っている:

scanf("%s\n", &details[size].name);
printf("Enter %s's number\n", details[size]->name);
scanf("%s\n", &details[size].number);

私はそれがあるべきだと思います:

scanf("%s\n", details[size]->name);
printf("Enter %s's number\n", details[size]->name);
scanf("%s\n", details[size]->number);

しかし、他にも多くの問題があり、私はまだ取り組んでいます。


これは単一のファイル SSCCE ( Short, Self-Contained, Correct Example ) です。

#include <stdio.h>
#include <stdlib.h>

typedef struct PhoneNumber
{
    char name[40];
    unsigned char number[10];
} PhoneNumber;

int inputPhoneNumbers(int size, PhoneNumber details[size]);
void displayPhoneNumbers(PhoneNumber *number);

int main(void)
{
    struct PhoneNumber PhoneNumbers[10];

    inputPhoneNumbers(10, PhoneNumbers);

    displayPhoneNumbers(PhoneNumbers);

    return EXIT_SUCCESS;
}

int inputPhoneNumbers(int size, PhoneNumber details[size])
{
    size = 0;
    printf("Enter a name\n");
    scanf("%s\n", details[size].name);
    printf("Enter %s's number\n", details[size].name);
    scanf("%s\n", details[size].number);

    return EXIT_SUCCESS;
}

void displayPhoneNumbers(PhoneNumber *number)
{
    printf("%s\n", number->name);
    printf("%s\n", number->number);
}

ここでの主な変更は、inputPhoneNumbers()関数の型の変更です。PhoneNumberへのポインターの配列ではなく、の配列を渡しますPhoneNumber。つまり、一貫した表記では.代わりに->.

于 2013-03-24T00:42:11.883 に答える
1

変化するint inputPhoneNumbers(int size, PhoneNumber *details[size])

int inputPhoneNumbers(int size, PhoneNumber *details)

そしてそれをこのように呼びます inputPhoneNumbers(10,PhoneNumbers);

于 2013-03-24T00:44:11.733 に答える
0

ここでは、混乱を解消するための試みを示します (ただし、混乱しないことを願っています)。また、Jonathan が指摘しているように、一貫性を保つようにしてください。

構造体へのアクセス

PhoneNumber a;
printf("%s", a.name); // Note a.name is a char pointer to the first byte of name

ポインターを介して

PhoneNumber *a;
printf("%s", a->name); // Uninitialized pointer, would need allocation

構造体の配列

PhoneNumber a[10];
printf("%s", a[0].name);
printf("%s", (a+0)->name); // note a is a PhoneNumber pointer to the a[0]

構造体へのポインターの配列

PhoneNumber *a[10];
printf("%s", a[0]->name); // Note a[0] is an uninitialized pointer
printf("%s", (*a[0]).name); // One would need to allocate storage

構造体の配列へのポインター

PhoneNumber (*a)[10];
printf("%s", (*a)[0].name);
printf("%s", a[0][0].name);
// Sometimes, when you have the right address, you can simply cast:
printf("%s", ((PhoneNumber*)a)->name);

ここでおそらくやりたいことは次のとおりです。

int main()
{
   struct PhoneNumber PhoneNumbers[10]; // Array of structs, contiguous in memory

   //input phone number
   inputPhoneNumbers(PhoneNumbers); // Pass a pointer to the first element

   //display PhoneNumber
   displayPhoneNumbers(PhoneNumbers);

   return EXIT_SUCCESS;
}


int inputPhoneNumbers(int size, PhoneNumber *details) // Take a pointer to a PhoneNumber
{
   /// ...
}
于 2013-03-24T00:59:42.650 に答える