[Error] request for member 'phone' in something not a structure or union
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define PEOPLE 50
struct _Person
{
char name[80];
char phone[80];
char email[80];
};
typedef struct _Person Person;
int main()
{
Person p[PEOPLE];
char key;
char str[80];
int n=0;
int i;
FILE *file;
while(1)
{
key = getche();
printf("\n");
switch(key)
{
case 'i':
gets(p[n].name);
gets(p[n].phone);
gets(p[n].email);
n++;
break;
case 'l':
for(i=0; i<n; i++)
{
printf("%d:\n", i+1);
printf("%s\n", p.name);
printf("%s\n", p.phone);
printf("%s\n", p.email);
printf("=================\n");
}
break;
case 's':
gets(str);
file = fopen(str, "w");
fprintf(file,"%d\n", n);
for(i=0; i<n; i++)
{
fprintf(file,"%s\t%s\t%s\n", p.name, p.phone, p.email);
}
fclose(file);
break;
case 'o':
gets(str);
file = fopen(str, "r");
if(file == NULL)
{
printf("檔案不存在!\n");
}
else
{
fscanf(file,"%d", &n);
for(i=0; i<n; i++)
{
fscanf(file,"\n%[^\t]%s%s", &p.name, &p.phone, &p.email);
}
fclose(file);
}
break;
case 'q':
return 0;
default:
printf("輸入錯誤\n");
}
system("pause");
system("cls");
}
return 0;
}
Person p[PEOPLE]; 代表 p是宣告成陣列,也就是說 p是存放結構的陣列,而不是結構,代表 p裡面有 50個 Person型別的結構。
因此 p是陣列(也可以理解為指向陣列的一個指標),p[n]才是結構(即指向結構的一個指標)。
你不能直接從陣列取出結構裡面的成員,編譯器會不知道你要哪一個結構的成員,你需要明確的指出來你要哪一個結構裡面的成員,例如:p[0].name。
(P.S. 上面有提到指向陣列/結構的指標,這意味著你可以透過下面的方式取出你要的東西)
(*p).name
(*(p + 1)).name
不過當然還是用陣列的方式比較直觀:
p[0].name
p[1].name
(上面兩段意義上是一樣的。)
最後,錯誤訊息提到:[Error] request for member 'phone' in something not a structure or union
那個 something在你的 Code裡,就是指 Array,
Array裡面存放 structure,當然沒有 member 'phone'囉!