C++程式問題,請幫我找程式的錯誤,謝謝

我想要做一個程式,就是要先定義巢狀結構,然後要宣告成結構陣列,又可以讓使用者輸入欄位值,再顯示出結構陣列的內容。請幫我找我的錯誤,順便告訴我要修改哪個地方,謝謝各位的幫忙。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#define MAX 3

struct student

{

char no[5]; /*學生編號*/

char sid[6]; /*學生學號*/

char name[20]; /*學生姓名*/

};

int main(void)

{

struct date

{

int year;

int month;

int day;

};

struct ename

{

char last[10];

char first[10];

};

struct person

{

char id[11]; /*學生身分證字號*/

char cname[10];/*中文名字*/

struct date birth;/*生日*/

char blood[2] ;/*血型*/

struct ename name;/*英文名字*/

};

int i, num=-1;

struct student st[MAX];

char keyin[5];

printf(\" ==== 學生資料登入作業 ==== \\n\\n\");

for (i=0;i<MAX; i++)

{

printf(\" 第 %d 個學生編號:\", i+1);

gets(st[i].no);

printf(\" 學生學號:\");

gets(st[i].sid);

printf(\" 學生姓名:\");

gets(st[i].name);

printf(\"\\n\");

struct person ps[i];

printf(\" 1. 身分證字號:\");

gets(ps[i].id);

printf(\" 2. 中文姓名 :\");

gets(ps[i].cname);

printf(\" 3. 出生年份 :\");

gets(ps[i].birth.year);

ps[i].birth.year=atoi(birth.year);

printf(\" 4. 出生月份 :\");

gets(ps[i].birth.month);

ps[i].birth.month=atoi(birth.month);

printf(\" 5. 出生日期 :\");

gets(ps[i].birth.day);

ps[i].birth.day=atoi(birth.day);

printf(\" 6. 血 型 :\");

gets(ps[i].blood);

printf(\" 7. 英文姓名 :\");

gets(ps[i].name.first,ps[i].name.last);

}

getch();

return 0;

}

1 Answer

Rating
  • ?
    Lv 5
    1 decade ago
    Best Answer

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    #include <conio.h>

    #define MAX 3

    struct student

    {

    char no[5]; /*學生編號*/

    char sid[6]; /*學生學號*/

    char name[20]; /*學生姓名*/

    };

    int main(void)

    {

    struct date

    {

    int year;

    int month;

    int day;

    };

    struct ename

    {

    char last[10];

    char first[10];

    };

    struct person

    {

    char id[11]; /*學生身分證字號*/

    char cname[10];/*中文名字*/

    struct date birth;/*生日*/

    char blood[2] ;/*血型*/

    struct ename name;/*英文名字*/

    };

    int i, num=-1;

    struct student st[MAX];

    char keyin[5];

    printf(" ==== 學生資料登入作業 ==== \n\n");

    for (i=0;i<MAX; i++)

    {

    printf(" 第 %d 個學生編號:", i+1);

    gets(st[i].no);

    printf(" 學生學號:");

    gets(st[i].sid);

    printf(" 學生姓名:");

    gets(st[i].name);

    printf("\n");

    struct person ps[10];//陣列大小一開始就必須定義

    printf(" 1. 身分證字號:");

    gets(ps[i].id);

    printf(" 2. 中文姓名 :");

    gets(ps[i].cname);

    printf(" 3. 出生年份 :");

    gets(ps[i].birth.year);//錯了 這裡為輸入字串 但你的struct宣告的是int

    ps[i].birth.year=atoi(birth.year);//int a=atoi(a) 當然錯,a重複宣告

    printf(" 4. 出生月份 :");

    gets(ps[i].birth.month);//錯了 這裡為輸入字串 但你的struct宣告的是int

    ps[i].birth.month=atoi(birth.month);//int a=atoi(a) 當然錯,a重複宣告

    printf(" 5. 出生日期 :");

    gets(ps[i].birth.day);//錯了 這裡為輸入字串 但你的struct宣告的是int

    ps[i].birth.day=atoi(birth.day);//int a=atoi(a) 當然錯,a重複宣告

    printf(" 6. 血 型 :");

    gets(ps[i].blood);

    printf(" 7. 英文姓名 :");

    gets(ps[i].name.first);//gets()只能輸入一個參數

    gets(ps[i].name.last);

    }

    getch();

    return 0;

    }

    已幫你修正幾個bug並加上註解

    剩下的bug是資料結構變數宣告的問題

    2006-03-14 09:37:42 補充:

    你只要再宣告一個char的結構陣列變數存放生日的字串

    再將這個字串用atoi分別存入year、month、day裡面

    最後再輸出即可

    Source(s): 自己
Still have questions? Get your answers by asking now.