今天在用Visual Studio 2019编写C项目的时候在使用scanf上出现了问题!
代码如下:
int student_add(int* len, struct student stu[])
{
struct student std;
int num,i;
printf("请输入学生人数:");
scanf("%d", &num);
for (i = 0; i < num; i++)
{
printf("请输入第%d个学生的信息:\n", i + 1);
printf("输入学号(1000):");
scanf("%d", &std.no);
fflush(stdin);//清空输入缓冲区
printf("姓名:");
scanf("%s", std.name);
printf("性别:");
scanf("%c", &std.sex);
printf("年龄:");
scanf("%d", &std.age);
printf("英语:");
scanf("%f", &std.english);
printf("语文:");
scanf("%f", &std.chinese);
printf("数学:");
scanf("%f", &std.math);
stu[*len] = std;
(*len)++;
}
student_array_save(*len, stu);//保存这个数组
student_array_print(*len, stu);
return 0;
}
项目主要写的是一个学生成绩管理系统,在输入学生信息时程序出现了异常。大概就是因为输入的是一个字符串,我们在输入的过程中它无法判断我们是否输入结束,即使我们按下回车它还以为我们是在输入,程序在判断上出现了问题。
我在百度这情况的时候发现可以通过在scanf后面清空输入缓冲区来解决:
fflush(stdin);
flush(stdin)是一个计算机专业术语,功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);。
使用了这语句之后发现并没用,好像是编译器的问题,此函数仅适用于部分编译器(如VC6),但是并非所有编译器都要支持这个功能(如gcc3.2)。这是一个对C标准的扩充。
我使用Viusal stdio 2019不行,而教学视频使用free-c却可以解决此问题。
思考来思考去想起了当初学习郝斌C语言视频过程中有一句判断输入时候结束的语句:
char ch;
while ((ch = getchar() )!= '\n')
continue;
意思是 一个字符一个字符地读键盘输入,只要没读到 enter 键,也就是没读到 ‘\n’ 就继续读。 一旦读到 ‘\n’, while 循环就结束。其中continue的作用是结束本次循环,然后继续去判断while里面的条件开始循环。
后来在百度过程中发现了一种新的解决方法:
printf("姓名:");
scanf("%s", std.name);
rewind(stdin);
具体的也没时间研究了,先写了一个帖子作为笔记,以后有空了慢慢研究。