linux 下连续使用多个scanf() 的问题和 fflush(stdin)的变通处理

Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存 Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存 清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);等,但是在linux这些都不起作用,还得我今天试了半天都没成功,上网搜了一下发现setbuf(stdin, NULL);直接将标准输入改为不带缓存的IO。这样就根本消除了缓冲区的存在,不必担心scanf得到的结 阅读详情

linux 下连续使用多个scanf() 会有问题,实例:


  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
    }
 
这段程序运行会出问题,当一次输入后,会不停的提示Please input:,程序不会在scanf等待下一次的输入。
一般资料会说添加fflush函数可解决这个问题:
  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
     fflush(stdin); 
    }
 
但是在gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-46)下,fflush函数形同虚设。man fflush有详细的说明可参考。
网络上有人说,在scanf之后使用一个getcahr()可解决,可是,当时输入多个字符还是有问题。
  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
     getchar(); 
    }
 
执行结果:

Please input: 1
Please input: 22
Please input: Please input: 333

Please input: Please input: Please input: 4444
Please input: Please input: Please input: Please input: 

 

添加一个循环,问题解决了:

while (1) 
{
    printf("Please input: ");
    scanf("%s",pstr) ;
    while ('/n' != getchar() );
}

   

附一个在网络上查到的另一个解决方法:

#define STR_BUFFSIZE 5
while (1)
   {
    printf("Please input: ");
    scanf("%s",pstr) ;     
    char buffer[STR_BUFFSIZE];
    while( fgets(buffer, STR_BUFFSIZE, stdin) != NULL )
    if(buffer[strlen(buffer)-1] == '/n' )
    }


结论:Linux下C语言连续多个scanf()这么不好用,用gets函数代替如何呢?gets函数也有漏洞!(网络搜索就知道了)

scanf这个现象是如何产生的呢?参考课本是可以有合理的解释。但还是代码说明一切。附一个版本scanf()函数的源代码下载地址: http://ftp.gnu.org/gnu/glibc/glibc-2.0.6.tar.gz 供有心人深入研究吧。


转载:http://blog.youkuaiyun.com/johnphan/article/details/5337509


Win11专业版破解RDP限制:实现多用户远程桌面协同办公 本文详细介绍了如何在Windows 11专业版上破解RDP限制,实现多用户远程桌面协同办公。通过使用RDPWrap工具,用户可以绕过微软的授权限制,允许多个用户同时登录同一台电脑,提高硬件利用率和团队协作效率。文章包含详细的安装配置步骤、性能优化技巧及常见问题解决方案,适用于需要远程协作的办公场景。 阅读详情

相关推荐

开源DIY龙门架:从零构建可编程运动控制平台

运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控,

weixin_33168937的博客 615

fflush函数

fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]。fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。 printf("。。。。。。。。。。。");后面加fflush(stdout);可提高打印效率。 但是,有一个问题,频繁的fflush会降低磁盘的使用寿命。

u011868149的专栏 967

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

linux同步IO: sync、fsync与fdatasync

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33943347的博客 799

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

全网最详细 解决戴维南定理的详细推导

替代定理,戴维南定理详细证明

m0_52555753的博客 3万+

c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法...

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如:fopen,feof,fgetc,fputs等函数,他们和平台无关。 2,网络通信中使用标准I/O的优点: 良好的移植性。良好移植性这个不需多解释,不仅是I/O函数,所...

weixin_34235105的博客 199

干法刻蚀工艺进阶:如何通过调节DC自偏压优化刻蚀速率和各向异性

本文深入探讨了干法刻蚀工艺中DC自偏压的精细调控艺术。DC自偏压是影响刻蚀速率和各向异性的关键因素,文章通过实战案例,详细分析了如何通过调节射频功率、频率、腔室压力及气体成分等参数,间接而有效地控制DC自偏压,从而优化高深宽比硅沟槽等复杂结构的刻蚀效果,实现工艺性能的精准提升。

weixin_28308325的博客 326

关于C语言在Linux系统中---------scanf函数与printf函数的使用

C语言内的scanf函数在Linux系统中的使用

rushrushgogogo的博客 1167

Spring Boot Swagger未授权访问漏洞:原理、风险与修复方案详解

在微服务架构中,API文档管理是开发与运维的重要环节。Swagger作为RESTful API文档生成与调试的标准化工具,通过OpenAPI规范自动生成交互式接口文档,极大提升了开发效率。然而,其默认配置往往缺乏访问控制,导致文档端点直接暴露,形成未授权访问漏洞。从技术原理看,该漏洞源于Spring Boot等框架集成Swagger时,相关端点未纳入安全框架的拦截范围,攻击者可通过扫描常见路径获取完整的接口定义与数据结构。这不仅会造成敏感信息泄露,更可能成为越权操作、数据篡改等深度攻击的入口点。在工程实践中

weixin_42524171的博客 494

利用恒源云在云端租用GPU服务器训练YOLOv10模型(包括Linux系统命令讲解)

为当涉及到深度学习的训练任务时,GPU的计算能力是不可或缺的。相对于传统的中央处理器(CPU),图形处理器(GPU)具有更强大的并行计算能力,能够显著加速深度学习模型的训练过程。深度学习算法通常涉及大量的矩阵运算和张量操作,而GPU的并行计算架构使得它们能够高效地执行这些计算,从而加速模型训练的速度。恒源云是一个经济高效的云计算平台,您可以通过恒源云的控制台或者命令行界面来管理实例、上传和下载数据、执行训练任务等。

Snu77的博客 1891

LinuxC语言的输入输出函数及运算符

三目运算符( a?b : c )可以作为逻辑运算的载体。b : c)的返回类型。用于计算类型或变量所占的内存大小。是C语言的内置关键字而不是函数。==||==从左向右开始计算。==&&==从左向右开始计算。||==具有更高的优先级。逻辑表达式中,==&&当三目运算符作为左值时。的值在编译期就已经确定。是编译器的内置指示符。

m0_72847002的博客 901

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2803

scanf和fflush

之前在百度知道上看到过一个问题,首先输出一句话,要求输入字符,然后再输出一句话要求输入一些字符,但是直接的使用scanf来获取的时候问题就出现了。下面是一个简单的程序,我们来看一看这个问题。 #include int main() { char a, c; p

kosl90的专栏 2170

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++基础知识:fflush(stdin)的误区

fflush(stdin)是一个计算机专业术语,功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);。 为什么 fflush(stdin) 是错的首先请看以下程序: #include <stdio.h>   int main( void )   {   int i;   for (;;) {   fputs("Please input an integer: ", stdout

kaikeba的博客 827

IMSL CNL 7.0.0 (x86-64)Crack

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

c语言中fflush((null)),C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);...

清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);setbuf(stdin, NULL);前两者仅对windows有用,最后一个则对Linux系统也适用。那么为什么需要清空键盘缓冲区呢?以下几个实例:Sample one01#include 0203int main(void)04{05char ch1;06char ch2;0708ch1 = getchar...

weixin_32924297的博客 672

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C/C++ 输入函数混用排雷:scanf 后接 fgets 的 3 种缓冲区清理方案

本文深入探讨了C/C++中scanf与fgets混用时的缓冲区冲突问题,提供了3种有效的缓冲区清理方案:getchar循环法、格式字符串调整法以及自定义安全输入函数。通过对比分析各方案的优缺点及性能测试,帮助开发者避免常见陷阱,提升输入处理的可靠性和效率。

weixin_33713707的博客 379

PTA编程题‘最佳情侣身高差’的三种解法与避坑指南:getchar()、scanf和缓冲区那点事

本文详细解析了PTA编程题‘最佳情侣身高差’的三种解法,重点探讨了C语言中输入流与缓冲区的管理问题。通过对比getchar()、scanf和自定义缓冲区清理函数的实现,提供了避免常见陷阱的实用指南,帮助初学者掌握健壮的输入处理技巧。

banghuo2937的博客 331

fflush,getchar(),setbuf()是时候清空你的缓存区啦

fflush();win系统下的清空缓存区函数,放在liunx下不会报错,但是没有鸟用 getchar():通过接受滞留在输入流中的内容达到清空缓存的效果,配套函数:while((num = getchar()) != '\n'); setbuf:setbuf(stdin,NULL);在liunx系统下很舒服 内容比较少,那就来几行代码吧(liunx) 代码演示: #include <stdio.h> int main() { char buff[128]; ...

小猪观察员的博客 535

c 语言中 scanf被跳过问题的解决方法

c 语言中 scanf被跳过问题的解决方法 在运行scanf函数时,scanf常常会被跳过。这是因为当你进行过了scanf函数后, 在第二次scanf函数时, 由于缓存区里依然存着第一次结束时送入的回车符,在第二次时没有读入就直接把回车符送入了,所以没有真正起到读入数据的作用。这个时候我们清除缓冲区就可以了。 解决方法: scanf前面加rewind(stdin); 或者 scanf前面 fflush(stdout) 不过在Linux 下面这两种方法都没用 Linux 下的解决方法: setbuf(st

anerely的博客 5992

C语言scanf函数缓冲区问题解析与安全输入实践指南

在C语言编程中,输入输出流和缓冲区管理是基础且关键的概念。理解其工作原理,有助于避免常见的程序错误。输入缓冲区作为数据暂存区,其残留字符(如换行符)常导致scanf函数出现“吃回车”等诡异现象。这背后涉及格式匹配与数据消耗机制,若处理不当,轻则逻辑异常,重则引发缓冲区溢出等安全漏洞。从工程实践角度,稳健的输入处理对程序鲁棒性至关重要。因此,掌握清空缓冲区策略(如使用getchar循环)和更安全的替代方案(如fgets+sscanf组合),成为开发者必备技能。本文聚焦scanf与scanf_s函数,深入探讨其

weixin_34150830的博客 557

scanf与gets的区分

1.getsc( )函数将接收整个字符串直到回车为止。 2.scanf()函数相比gets()函数输入字符串存在一个问题,那就是输了空格之后会认为输入字符串结束,空格后字符将作为下一个输入项处理。 当然了,对于scanf也可以处理这问题。可以加入%【】,【】内可以加^任意字符(eof)来结束 字符串的输入如%【^eof】就是直到有eof输入才表示输入字符串终止。 ...

qq_42579119的博客 278

scanf引出的输入缓冲区问题

 本文转自http://www.cnblogs.com/papo/archive/2009/09/17/1568819.html 刚才一个朋友发了一段代码:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#includestdio.

xuguangyin5210的专栏 907

【C语言】getchar与putchar实战:从缓冲区陷阱到高效字符处理

本文深入探讨了C语言中getchar与putchar的使用技巧,从基础用法到缓冲区陷阱的解决方案。通过实际案例展示了如何高效处理字符输入输出,包括清空缓冲区的正确方法和构建健壮交互界面的技巧,帮助开发者避免常见错误并提升代码质量。

weixin_30915275的博客 313

scanf这句时,系统并不是等待用户输入

#include <stdio.h> #define BUG puts("here"); int main() { setbuf(stdin, NULL); char a, b; while (scanf("%c%c", &a, &b) == 2) { printf("%c\n", a); BUG printf("%c\n", b);...

anchang7456的博客 432

fflush用法的注意事项

今天写代码的时候调试程序,老是出现段错误,通过gdb发现在用scanf

JackyLau的专栏 2033
上一篇: Android ANR
下一篇: Android之Service与IntentService的比较
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值