我编写了一段代码来输入学生信息,如下所示。当学生 ID 附加姓氏时出现问题。我知道错误在于输入 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]);
}
}
如图所示错误,谢谢大家 enter image description here
最佳答案
请注意,s[i].ID
定义为char ID[8]
。但是,输入的 ID 是 1234567b,它是 8 个字符。如果 id 应该是 1234567
,那么您就忽略了输入结束字符串所需的 \0
NULL 字符。结果 printf("ID STUDENT :%s\n",s[i].ID);
从 s[i].ID
的开头打印,直到第一个 NULL 字符(位于名称末尾)。
关于c - 结构体时字符串重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43745168/