为什么我的程序不能读取带有 gets 函数的字符串并且它通过它并只给我早期 scanfs 的最终结果

Why isn't my program able to read a string with gets function and it passed throught it and gives me just the final results of the earlier scanfs

所以这是一个程序,我想在其中输入从学生 1 到学生 2 的询问变量(学号、平均成绩、入学年份和校友课程),我必须使用一个 lib 文件,它我命名为 alumn.h,其中我有 typdef 结构和函数 copyAlumn,它将从输入 sturct ALUMN 和 return 复制它的值到第二个。问题是,在控制台中,除了读取它的字符串外,一切正常:当我使用 gets 函数时,它会自动传递它并给我打印结果。 我的错误是什么?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"alumn.h"

int main(){

    ALUMN A1,*A2;


    printf("Alumn A1:\nInsert the alumn number: ");
    scanf("%d",&A1.num);
    printf("Insert the year of entrance: ");
    scanf("%d",&A1.year);
    printf("Insert its avg. grade: ");
    scanf("%f",&A1.grade);
    printf("Insert its course: ");
    gets(A1.course);

    A2 = copyAlumn(&A1);

    if(A2 == NULL)
        return 0;

    printf("\n\nAlumn A2 = Copy from A1:\nNumber: %d\nYear: %d\nAvg. Grade: %.2f\nCourse: %s\n",A2->number,A2->year,A2->grade,A2->course);
return 1;
}

您可能会在代码中发现一些标记错误的函数,因为我刚刚将其翻译成英文,而有些函数我可能已经通过而没有更改。我相信那不是c的问题。 抱歉我的英语不好,因为你可以看到它不是我的主要语言...... 提前致谢!

--编辑-- 正如评论中所问,这里是 Alumn.h 文件代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
    int num;
    int year;
    char course[30];
    float grade;
}ALUMN;

ALUMN *copyAlumn(ALUMN *A){
    ALUMN *B;

    B = (ALUMN *)malloc(sizeof(ALUMN));

    if(B==NULL)
        return NULL;

    //*B=*A;
    (*B).num=(*A).num;
    (*B).year = (*A).year;
    (*B).grade = (*A).grade;
    strcpy((*B).course,(*A).course);

    return B;
}

scanf("%f",&A1.grade);
printf("Insert its course: ");
gets(A1.course);

当您输入 grade 的值时,您用换行符完成了它(例如 12.23<enter>),12.23 部分是由 scanf 使用,输入中仍然存在的换行符由 gets 获取,returns 一个空字符串

混合使用 scanfgets

是个坏主意

你可以替换

printf("Alumn A1:\nInsert the alumn number: ");
scanf("%d",&A1.num);
printf("Insert the year of entrance: ");
scanf("%d",&A1.year);
printf("Insert its avg. grade: ");
scanf("%f",&A1.grade);
printf("Insert its course: ");
gets(A1.course);

来自

char s[16];

printf("Alumn A1:\nInsert the alumn number: ");
if ((fgets(s, sizeof(s), stdin) == NULL) ||
    (sscanf(s, "%d",&A1.num) != 1)) {
  /* indicate error */
  return -1;
}

printf("Insert the year of entrance: ");
if ((fgets(s, sizeof(s), stdin) == NULL) ||
    (sscanf(s, "%d",&A1.year) != 1)) {
  /* indicate error */
  return -1;
}

printf("Insert its avg. grade: ");
if ((fgets(s, sizeof(s), stdin) == NULL) ||
    (sscanf("%f",&A1.grade) != 1)) {
  /* indicate error */
  return -1;
}

printf("Insert its course: ");
if (fgets(A1.course, sizeof(A1.course), stdin) == NULL) {
  /* indicate error */
  return -1;
}

如您所见,我使用 fgets 而不是 gets 以确保不会因未定义的行为而超出字符串范围