C/C++ 误区:fflush(stdin)

【C语言学习笔记】MATH中的常用函数大汇总及应用 MATH中的常用函数大汇总: *开头需引入#include <math.h> 1.绝对值 整数:int x = abs(y); 浮点数:double x = fabs(y); 2.指数和对数 求e的y次幂:double x = exp(y); 求x为底数的y次幂:double n = pow(x,y); 计算x的开平方:double x = sqrt(x); 求logeX:double n = log(x); 求log10X:double n = log10(x); 题目一: 计算两点间的距 阅读详情
1. 为什么 fflush(stdin) 是错的

首先请看以下程序:

#include <stdio.h>



int main( void )

{

int i;

for (;;) {

fputs("Please input an integer: ", stdout);

scanf("%d", &i);

printf("%d\n", i);

}

return 0;

}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用
fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

int fflush(FILE *stream);

如果stream指向输出流或者更新流(update stream),并且这个更新流
最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream
指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。
fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush
函数会给那些流打上错误标记,并且返回EOF,否则返回0。

由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用
fflush(stdin) 是不正确的,至少是移植性不好的。



2. 清空输入缓冲区的方法

虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。

/* C 版本 */

#include <stdio.h>



int main( void )

{

int i, c;

for (;;) {

fputs("Please input an integer: ", stdout);

if ( scanf("%d", &i) != EOF ) { /* 如果用户输入的不是 EOF */

/* while循环会把输入缓冲中的残留字符清空 */

/* 读者可以根据需要把它改成宏或者内联函数 */

/* 注:C99中也定义了内联函数,gcc3.2支持 */

while ( (c=getchar()) != '\n' && c != EOF ) {

;

} /* end of while */
}

printf("%d\n", i);

}

return 0;

}



/* C++ 版本 */

#include <iostream>

#include <limits> // 为了使用numeric_limits



using std::cout;

using std::endl;

using std::cin;



int main( )

{

int value;

for (;;) {

cout << "Enter an integer: ";

cin >> value;

/* 读到非法字符后,输入流将处于出错状态,

* 为了继续获取输入,首先要调用clear函数

* 来清除输入流的错误标记,然后才能调用

* ignore函数来清除输入缓冲区中的数据。 */

cin.clear( );

/* numeric_limits<streamsize>::max( ) 返回缓冲区的大小。

* ignore 函数在此将把输入缓冲区中的数据清空。

* 这两个函数的具体用法请读者自行查询。 */

cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );

cout << value << '\n';

}

return 0;

}



参考资料:

ISO/IEC 9899:1999 (E) Programming languages— C 7.19.5.2 The fflush function

The C Programming Language 2nd Edition By Kernighan & Ritchie

ISO/IEC 14882(1998-9-01)Programming languages — C++
Altium Designer操作技巧(4)——如何利用嘉立创EDA来输出3D封装到AD封装库? 本文介绍了利用嘉立创EDA和FreeCAD软件为PCB元件添加3D模型的方法。首先在嘉立创EDA中搜索元件编号并导出3D模型,然后使用FreeCAD删除3D模型中的PCB基板部分,最后将处理后的3D模型导入PCB封装库并更新到PCB设计中。文章详细讲解了每个步骤的操作流程,包括模型导出、基板删除、位置调整等关键环节,并提供了解决常见问题的方法。通过这种方法,电子工程师可以快速获得元器件的3D模型,提高PCB设计的准确性。 阅读详情

相关推荐

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6684

C fflush()函数

fflush()用于清空文件缓冲区,如果文件是以写的方式打开 的,则把缓冲区内容写入文件。其原型为:     int fflush(FILE* stream); 【参数】stream为文件指针。 【返回值】成功返回0,失败返回EOF,错误代码存于errno 中。指定的流没有缓冲区或者只读打开时也返回0值。 fflush()也可用于标准输入(stdin)和标准输出(stdout)

qq_29233719的博客 1297

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4477

c语言中fflush作用,详解C语言fflush()函数的使用

fflush是计算机函数,计算机可以通过这个功能处理磁盘文件,在这里也是比较常使用的功能,今天爱站技术频道详解C语言fflush()函数的使用,跟着小编的步伐一起来看看吧!fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。 fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。 fflush(stdout)这个例子可能不太明显,但对stdi...

weixin_39891158的博客 7893

VMware Workstation Pro 25H2 去虚拟化精简便携版完全指南

虚拟机技术在现代开发和测试环境中扮演着重要角色,但客户机系统常因暴露虚拟化特征而被特定软件识别为“虚拟机”,导致功能受限。同时,官方 VMware Workstation Pro 安装包体积大、安装流程繁琐,难以实现移动化部署。去虚拟化通过修改 VMX 配置、屏蔽 CPUID 特征、反射宿主机硬件信息等手段降低被检测概率;精简与便携则通过裁剪非核心文件和改用脚本注册服务,实现即解压即用的轻量化形态。这类改版方案特别适合临时环境搭建、敏感软件兼容测试以及构建随身开发环境。本文从虚拟化检测原理出发,系统梳理了

weixin_34068198的博客 378

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

C语言中的fflush函数

函数名: fflush   功 能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件   原型:int fflush(FILE *stream)        1、C99 对 fflush 函数的定义: int fflush(FILE *stream); 如果stream指向输出流或者更新流(update stream),并且这个更新流最近执

wdt3385的专栏 2126

四自由度SCARA机器人的运动学和动力学MATLAB建模与仿真

本文介绍了四自由度SCARA机器人的运动学和动力学建模,使用MATLAB进行了相应的建模与仿真。通过正运动学和动力学分析,可以了解机器人在不同状态下的运动特性和力学特性。这为后续的控制算法设计和性能优化打下了基础。希望本教程对学习SCARA机器人有帮助。

小蜗牛的珍贵百宝箱 3639

C/C++ —— fflush(stdin)(

C/C++ —— fflush(stdin)<br />                                      1.       为什么 fflush(stdin) 是错的首先请看以下程序:#include<stdio.h><br />int main( void ){    int i;    for (;;) {        fputs("Please input an integer: ", stdout);        scanf("%d", &i);        prin

dqswuyundong的专栏 1312

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

C/C++语言误区之:fflush(stdin)

1.为什么fflush(stdin) 是错的  首先请看以下程序:   #include   int main( void )   {       int i=1;       while(i)       {           printf("Please input an integer: ");           scanf("%d", &i);

quliuliu2012的专栏 513

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 237

C/C++ 误区二:fflush(stdin)

<!--google_ad_client = "pub-2132256014190581";/* 160x600, 创建于 09-1-4 */google_ad_slot = "4461398019";google_ad_width = 160;google_ad_height = 600;//-->1.       为什么 fflush

嵌入式 Linux ARM ADS ADHOC C C++ PLC 单片机 2597

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[转]C/C++ 误区二:fflush(stdin)

C/C++ 误区二:fflush(stdin) 来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品 发布于2005-10-22 13:56 被读8163次 【字体:大 中 小】  

Daniel Hua 的技术博客 668

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【转】C/C++ 误区二:fflush(stdin)

[size=11][b]1.为什么 fflush(stdin) 是错的[/b][/size] [size=11]首先请看以下程序:[/size] [code="c"]#include int main( void ) { int i; for (;;) { fputs("Please input an integer: ", stdout); ...

VincentZheng163的专栏 233

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C/C++语言误区之:fflush(stdin)

1.为什么fflush(stdin) 是错的 首先请看以下程序: #include int main( void ) {     int i=1;     while(i)     {         printf("Please input an integer: ");         scanf("%d

team-vx的专栏 1081

C/C++ 误区三:fflush(stdin)

 1.       为什么 fflush(stdin) 是错的 首先请看以下程序:                    #include stdio.h> int main( void ){    int i;    for (;;) {        fputs("Please input an integer

k的专栏 1058
上一篇: C++中的类所占内存空间总结
下一篇: C++:最小公倍数&最大公约数&润年判别
码农挤奶
博客等级 码龄17年 10粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值