为什么我的程序无法读取具有gets函数的字符串,并通过它传递了该字符串,并且只给出了早期scanfs的最终结果

时间:2019-03-14 15:19:20

标签: c gets string.h

所以这是一个程序,我要输入从学生1到学生2的要求变量(学校编号,平均年级,入学年份和校友课程),我必须使用一个lib文件,我将其命名为alumn.h,这里有typdef结构和函数copyAlumn,它们将从输入的struct ALUMN复制并将其值返回到第二个。关键是,在控制台中,除了读取它的String之外,其他所有东西都可以正常工作:当我使用 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;
}

您可能会在代码中发现一些标记错误的函数,因为我刚刚将其翻译为英语,还有一些可能没有更改就通过了。我相信这不是问题。 对不起,我的英语不好,因为您可以看到这不是我的主要语言... 预先感谢!

-编辑- 如评论中的要求,这是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;
}

1 个答案:

答案 0 :(得分:2)

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

当您输入 grade 的值时,您会用换行符(例如12.23<enter>)将其完成,而 12.23 部分被 scanf使用,输入中仍然存在的换行符是由 gets 获取的,后者返回一个空字符串

scanf gets

混合使用是一个坏主意

您可以替换

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 来确保不会出现未定义行为的字符串