`
xitonga
  • 浏览: 590470 次
文章分类
社区版块
存档分类
最新评论

C语言清除输入缓冲区

 
阅读更多

在使用scanf输入时,如果输入不合法,此时可以检查其返回值为0,但下次再调用时,上次不合法的输入,还在输入缓冲区中,此时就会接着不合法,如下:

#include <stdio.h>
int main(int argc,char** argv){
        int id  ;
        int ret = scanf("%d",&id);
        while(ret == 0){
                ret = scanf("%d",&id);
                printf("input failed\n");
        }
        printf("you input is %d\n",id);
        return 0;
}
这样,如果输入不合法时,就会在while里不断的循环,这是因为id没有被正确的读入,此时缓冲区里的输入还在,所以下次scanf时,又会读取缓冲区中的东西。


有这么几种方法,可以解决这个问题

一,使用setbuf

功 能: 把缓冲区与流相联
用 法: void setbuf(FILE *steam, char *buf);
说明:setbuf函数具有打开和关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ(定义在stdio.h头文件中)的缓冲区。通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可以将其设置为行缓冲。为了关闭缓冲,可以将buf参数设置为NULL。

#include <stdio.h>
int main(int argc,char** argv){
        int id  ;
        int ret = scanf("%d",&id);
        while(ret == 0){
                printf("input failed\n");
                setbuf(stdin,NULL);
                ret = scanf("%d",&id);
        }

        printf("you input is %d\n",id);
        return 0;
}


二,使用__fpurge

#include <stdio.h>
int main(int argc,char** argv){
        int id  ;
        int ret = scanf("%d",&id);
        while(ret == 0){
                printf("input failed\n");
        //      setbuf(stdin,NULL); 1
                __fpurge(stdin);
                ret = scanf("%d",&id);
        }

        printf("you input is %d\n",id);
        return 0;
}

如果提示没有找到这个函数的话,则需要包含#include <stdio_ext.h>


三,把缓冲区全读完

#include <stdio.h>
int main(int argc,char** argv){
        int id  ;
        char c ;
        int ret = scanf("%d",&id);
        while(ret == 0){
                printf("input failed\n");
        //      setbuf(stdin,NULL); 1
        //      __fpurge(stdin);
        //
                do{
                        c = getchar();
                }while(c != '\n' && c != EOF);
                ret = scanf("%d",&id);
        }

        printf("you input is %d\n",id);
        return 0;
}

经过测试,上面的方法都可以实现目的。

分享到:
评论

相关推荐

    C语言清除scanf()缓存的案例讲解

    那么下面我就对scanf()中清除输入缓冲区的方法讲解: 应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误...

    c语言学生信息管理系统.zip

    大一C语言期末课程设计---学生信息管理系统。该课程设计覆盖C语言中的数据结构双向链表的使用,其中包换链表节点的...其中包换的C语言知识点:输入输出缓冲区的清除、函数、结构体、指针、标准io、数据结构双链表等等。

    你必须知道的495个C语言问题

    1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型...

    你必须知道的495个C语言问题(PDF)

    1.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢? . . 5 2 结构、联合和枚举7 2.1 声明struct x1 f . . . g; 和typedef struct f . . . g x2; 有什么不同? . 7 2.2 为什么struct x f . . . g; x ...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    C语言通用范例开发金典.part2.rar

    范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 ...

    《C语言高级编程与实例剖析》源码

    8.4.11 清除键盘缓冲区clr_kb_buff模块 363 8.4.12 返回鼠标按下操作键值getmousech模块 363 8.4.13 处理用户对功能热键的操作handle模块 364 8.5 小结 377 第9章 综合开发实例——信息管理系统 378 ...

    C语言FAQ 常见问题列表

    o 2.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢? * 3. 结构、联合和枚举 o 3.1 声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同? o 3.2 为什么 struct x { ...}; x ...

    c语言编写单片机技巧

    输入电压测试:测量每个输入接脚的输入电压反应特性。 &#61548; 输出电压测试:测量每个输出接脚的输出电压位准。 &#61548; 相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。 ...

    C语言通用范例开发金典.part1.rar

    范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 ...

    基于c的简单的人员录入系统

    ='\n')//清除行输入缓冲区 continue; switch(select){ case 1: showAll(team,count); break; case 2: count=addMember(team,count); break; case 3: ...

    用C语言开发手机软件 -Windows+CE+6.0开发者参考

    17.2.2 缓冲区管理 17.2.3 驱动程序接口类 17.2.4 设备驱动程序的电源管理 17.3 设备驱动程序的构建 17.3.1 DebugZone 17.3.2 Gentle驱动程序示例 17.4 服务 17.4.1 服务的体系结构 17.4.2 服务的生命周期 17.4.3 ...

    用C语言开发手机软件-Windows CE 6.0开发者参考

    17.2.2 缓冲区管理 17.2.3 驱动程序接口类 17.2.4 设备驱动程序的电源管理 17.3 设备驱动程序的构建 17.3.1 DebugZone 17.3.2 Gentle驱动程序示例 17.4 服务 17.4.1 服务的体系结构 17.4.2 服务的生命周期 17.4.3 ...

    数据结构查找

    学习,教育,c语言void main() { int DATA[MAX]; //原始数据 int KeyValue; //欲查找数据变量 int num; char choice; while(1) ... printf("请输入需要产生的数据个数:");... //清除键盘缓冲区 } Counter=1; }

    会计理论考试题

    A、计算机病毒通常是一段可运行的程序 B、反病毒软件可清除所有病毒 C、加装防病毒卡的微机不会感染病毒 D、病毒不会通过网络传染 14.在Windows98中,如果删除了软盘上的文件,则该文件在Windows98中___A____。 A、...

    软件工程-理论与实践(许家珆)习题答案

    顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解。 底层:由不再进行分解的基本加工组成。 4. 加工小说明有...

    Windows内核安全与驱动开发光盘源码

    8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 123 8.4.2 从KEYBOARD_INPUT_DATA中得到键 124 8.4.3 从MakeCode到实际字符 124 8.5 Hook分发函数 126 8.5.1 获得类驱动对象 126 8.5.2 修改类驱动的分发函数指针 127...

Global site tag (gtag.js) - Google Analytics