所以这是一个程序,我要输入从学生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;
}
答案 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 来确保不会出现未定义行为的字符串