我是靠谱客的博主 害羞跳跳糖,最近开发中收集的这篇文章主要介绍关于c语言中scanf清除缓冲区的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    在写计算机图形学的时候,创建菜单,每一个菜单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清除缓冲区的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部