在使用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;
}
经过测试,上面的方法都可以实现目的。
分享到:
相关推荐
那么下面我就对scanf()中清除输入缓冲区的方法讲解: 应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误...
大一C语言期末课程设计---学生信息管理系统。该课程设计覆盖C语言中的数据结构双向链表的使用,其中包换链表节点的...其中包换的C语言知识点:输入输出缓冲区的清除、函数、结构体、指针、标准io、数据结构双链表等等。
1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型...
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语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 ...
8.4.11 清除键盘缓冲区clr_kb_buff模块 363 8.4.12 返回鼠标按下操作键值getmousech模块 363 8.4.13 处理用户对功能热键的操作handle模块 364 8.5 小结 377 第9章 综合开发实例——信息管理系统 378 ...
o 2.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢? * 3. 结构、联合和枚举 o 3.1 声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同? o 3.2 为什么 struct x { ...}; x ...
输入电压测试:测量每个输入接脚的输入电压反应特性。  输出电压测试:测量每个输出接脚的输出电压位准。  相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。 ...
范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 ...
='\n')//清除行输入缓冲区 continue; switch(select){ case 1: showAll(team,count); break; case 2: count=addMember(team,count); break; case 3: ...
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 ...
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. 加工小说明有...
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...