2017-05-02 24 views
-2

我編寫了一個代碼來輸入學生信息,如下所示。出現該問題時,學生ID追加Lastname.I知道錯誤在於進入ID和姓氏,但我不明白,並修復它當結構體字符串重疊

#include "stdio.h" 
#include "string.h" 
typedef struct Fullname_s{ 
    char Lastname[20]; 
    char Fistname[10]; 
}Fullname; 
typedef struct Birthday_s{ 
    int Day,Month,Year; 
}Birthday; 
typedef struct Mark_s{ 
    float mark[10]; 
}Mark; 
typedef struct SV{ 
    char ID[8]; 
    Fullname F_name; 
    Birthday B_day; 
    char Sex[5]; 
    Mark _Mark; 
}sv; 
sv s[100]; 
void inputsv(sv s[],int *n); 
void printinfo(int i); 
void output(sv s[],int n); 
int main(){ 
    int n; 
    inputsv(s,&n); 
    output(s,n); 
} 

void inputsv(sv s[],int *n){ 
    printf("--------Enter Students information--------\n"); 
    printf("Enter number of students \n"); 
    scanf("%d",n); 
    int i=0; 
    while(i<*n){ 
     int x; 
     printf("-------------------------Student %d-------------------------- \n",i+1); 
     printf("ID Student : "); 
     fflush(stdin); 
     scanf("%s",&s[i].ID); 
     gets(); 
     printf(" Lastname : "); 
     fgets(s[i].F_name.Lastname,20,stdin); 
     printf(" Fistname : "); 
     gets(s[i].F_name.Fistname);  
     do{ 
      puts("Enter 0 :MALE"); 
      puts("Enter 1 :FEMALE"); 
      scanf("%d",&x); 
      if(x==0) 
       strcpy(s[i].Sex,"MALE"); 
      else 
       strcpy(s[i].Sex,"FEMALE"); 
     }while(x!=0&&x!=1); 
     printf(" Birthday : "); 
     scanf("%d%d%d",&s[i].B_day.Day,&s[i].B_day.Month,&s[i].B_day.Year); 
     for(int j=0;j<10;j++){ 
     printf(" Mark %2d:",j+1); 
     scanf("%f",&s[i]._Mark.mark[j]); 
     } 
     i++; 
     gets(); 
    } 
} 

void output(sv s[],int n){ 
    printf("STUDENTS INFORMATION \n"); 
    for(int i=0;i<n;i++){ 
     printf("--------------------\n"); 
     printf(" STUDENT %2d\n",i+1); 
     printinfo(i); 
     printf("-------------\n"); 
     } 
    printf("------------------------\n"); 
} 

void printinfo(int i){ 
    printf(" ID STUDENT :%s\n",s[i].ID); 
    printf(" FULLNAME :%s %s  \n",s[i].F_name.Lastname,s[i].F_name.Fistname); 
    printf(" BIRTHDAY :%2d-%2d-%4d \n",s[i].B_day.Day,s[i].B_day.Month,s[i].B_day.Year); 
    printf(" SEX   :%s\n",s[i].Sex); 
    for(int j=0;j<10;j++){ 
     printf(" MARK %2d : %0.2f \n",j+1,s[i]._Mark.mark[j]); 
    } 
} 

錯誤作爲picture.Thanks所有 enter image description here

+3

不要'fflush(stdin)'。 '性別[5]'不包含'女性'。你只爲男性設計嗎?最大身份證號碼有多久? –

+0

https://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557 – melpomene

+0

感謝您的回覆。但問題出在ID和姓氏 – Divide

回答

0

請注意0​​被定義爲char ID[8]。不過,輸入的ID是1234567b這是8個字符。如果ID應該是1234567,那麼你忽略了放入\0 NULL字符來結束字符串。結果printf(" ID STUDENT :%s\n",s[i].ID);s[i].ID開始打印,直到第一個空字符(名稱末尾)。

+0

謝謝。所以,如果我想要的id是一個8字符的字符串,我必須使用char id [9]? – Divide

+0

@Divide當然。任何C教程都應該解釋你需要在C字符串中添加一個額外的字節作爲結尾的空值。 – Barmar

+0

非常感謝 – Divide