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(简短、自包含、正确的示例)。

#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

这是一个让你不迷惑的尝试(希望我自己不会迷惑)。同样正如乔纳森所说,要保持一致,我会尝试使用最简单的符号。

访问结构

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 回答