c - 结构体时字符串重叠

标签 c

我编写了一段代码来输入学生信息,如下所示。当学生 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/

相关文章:

c - C中typedef结构中的函数指针

c - 如何访问字符数组的第一个字符?

c - 用可移动的角色在C中制作一个带边框的盒子

c - SSE 16 位寄存器的无符号/有符号减法

c - 为什么 UINT_MAX + 3 总是等于 2?

c - 新程序员来了,这个堆栈程序有什么问题吗?

c - 这段代码中的段错误在哪里?

c - &"string"与 "string"是同一地址吗?

c++ - 查找耗时

将用户输入的转义序列转换为它们的真实表示