iT邦幫忙

0

看不懂錯誤訊息

[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;
}
看更多先前的討論...收起先前的討論...
70002 iT邦新手 5 級 ‧ 2021-09-07 18:01:33 檢舉
這甚麼意鼠
在非結構或聯合體中請求成員“電話
白話給你
「p.phone不存在」
gets(p[n].phone);
printf("%s\n", p.phone);
有看出來哪裡不同了嗎?
小魚 iT邦大師 1 級 ‧ 2021-09-07 19:12:58 檢舉
我好奇的是,
為什麼出問題的不是name ?
還是說C語言的name是有意義的?
70002 iT邦新手 5 級 ‧ 2021-09-07 19:19:53 檢舉
不是沒問題
因為name email phone 這三個都是同一種錯誤 我才只打一個
70002 iT邦新手 5 級 ‧ 2021-09-07 20:57:53 檢舉
解不出來QAQ
你有注意到 你用了 array ... 然後後面是 沒有 array 的.
其實人家「一級屠豬」已經比我點的更明白了。
我只是針對你的問題回答你。畢竟你並沒說要「解題」。只是問錯誤訊息。
也就是 「p.phone 不存在」
至於為何不存在你就需要自已去理解了。

其它大大們已經寫的更詳細了。如果還看不出來....嗯~~~
我覺得 這種用題目方式的,學習效果不會太好.
因為這類的規劃的很緊湊,而且很愛用輸入的方式,不使用簡單的內部直接給值,
以這個題目來說,學習的用處無需到50, 數筆資料就夠了.
像是 array 記得沒多久之前才問,現在一下就到 struct 了, 太快太陡了.
確實跳太快了。雖然這問題對我們來說。完全「無」解的必要就是了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
makai0117
iT邦新手 5 級 ‧ 2021-09-08 02:01:31
最佳解答

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'囉!

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-09-08 09:57:08
如果它是地址,就在它后边用 ->,如果它不是地址,就在它后边就用 .

資料來源

https://ithelp.ithome.com.tw/upload/images/20210908/20001787dodFK9bpxa.png
簡報第五頁

照問問題的內容來看
你應該是學生
不知道現在幾年級?

70002 iT邦新手 5 級 ‧ 2021-09-08 12:55:02 檢舉

升大一

可以照學校的課程進度學習是最好
如果要自學的話
找本書或是TutorialsPoint或是W3School
按步就班一步一步來
你的時間很多
打穩基礎比速成作品來得重要

我要發表回答

立即登入回答