scanf函数输入时出错以及解决方法

       今天在用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);

       具体的也没时间研究了,先写了一个帖子作为笔记,以后有空了慢慢研究。

猜你喜欢

转载自blog.csdn.net/weixin_43736860/article/details/106304673