概述
在写计算机图形学的时候,创建菜单,每一个菜单case对应一种scanf_s的输入.
查资料:(scanf有安全漏洞,具体体现在以%s接受输入的数据时(%c,%d,%f之类的没什么影响),多余的数据读多了,或者没读完(易被黑客利用),在VS2005版本中微软发布了scanf_s以替代scanf,所以在功能上两者最大的区别是安全性。)
菜单的实现功能代码
void colormenufunc(int date) { //颜色变化子菜单函数
safe_flush(stdin);
switch (date) {
case 1:
printf("请输入所需颜色,在0-1f之间");
scanf_s("%f,%f,%f", &Rrcolor, &Rgcolor, &Rbcolor);
glutPostRedisplay();
break;
case 2 :
printf("请输入所需颜色,在0-1f之间");
scanf_s("%f,%f,%f", &Crcolor, &Cgcolor, &Cbcolor);
glutPostRedisplay();
break;
case 3:
printf("请输入所需颜色,在0-1f之间");
scanf_s("%f,%f,%f", &Srcolor, &Sgcolor, &Sbcolor);
glutPostRedisplay();
break;
}
}
运行代码时发现,第一次打开菜单,选择其中一个功能后,输入数据能够运行该项菜单功能。但是再第二次打开菜单,选择功能时,出现了数据不能够输入的情况。
判断:刚开始并不知道是什么问题,猜想是scanf没有清除缓存而造成的,于是进行scanf缓存清除的学习。
了解了scanf的缓存。
当我们通过scanf输入1+ <回车>时,读入scanf缓存区的是“1n",当我们执行接下来的scanf语句时,直接从我们scanf缓冲区里读出了n的语句出来,我们并没有输入,该scanf语句便执行了。
查资料:当我们用 scanf 输入数字时候, 会从键盘缓冲区读取, 直接读取你键盘上输入的数字, 当用 scanf 输入字符时会从输入流缓冲区读取值, 也就是在 缓存 里先读出了n, 导致还没输入字符程序就已经向下执行了。
了解了scanf的缓存产生原因,问题是如何去清除scanf的缓存区。
void safe_flush(FILE* fp)//定义一个清除缓存的函数
{
int ch;
while ((ch = fgetc(fp)) != EOF && ch != 'n');
}
safe_flush(stdin); //调用该函数
解释:
File文件的指针 fp
fgetc()函数:
该函数C 库函数 int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。通过该函数
EOF,End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
stdin是标准输入 std即standard(标准),in即input(输入),合起来就是标准输入。
添加后能够多次从菜单输入。
这是我的初步见解,如果有不对的地方,恳请指正,非常感谢!!!
资料原文链接:https://blog.csdn.net/henu1710252658/article/details/83040281
https://zhuanlan.zhihu.com/p/35435351
最后
以上就是害羞跳跳糖为你收集整理的关于c语言中scanf清除缓冲区的问题的全部内容,希望文章能够帮你解决关于c语言中scanf清除缓冲区的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复