为什么我的程序不能读取带有 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 一个空字符串
混合使用 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 以确保不会因未定义的行为而超出字符串范围
所以这是一个程序,我想在其中输入从学生 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 一个空字符串
混合使用 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 以确保不会因未定义的行为而超出字符串范围