深入了解scanf()/getchar()和gets()等函数

ArcGIS基于DEM提取微流域单元(附练习数据下载) 流域作为一个相对独立的地理单元,与行政区的划分有着本质上的区别。流域的划分更注重自然因素,流域作为一个综合的自然整体,在其内部形成了一个天然的物质与能量流动的场所,并通过水流的作用,与周围的区域进行物质和能量的交换。流域的精确划分作为一个研究的基础工作,那么接下来给大家说一下利用DEM提取小流域的案例教程——以贵州省遵义市正安县为例。 1 数据获取 地理空间数据云(http://www.gscloud.cn/),数据分辨率为30m。也可直接点击这篇直接下载→全国30m90mDEM下载。 若想要获得更高精度. 阅读详情

   scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序:
程序1:
    #include <stdio.h>
    int main()
    {
 char ch1, ch2;
 scanf("%c", &ch1);
 scanf("%c", &ch2);
 printf("%d  %d/n", ch1, ch2);
 return 0;
    }
    或者是:

   
#include <stdio.h>
    int main()
    {
 char ch1, ch2;
 ch1 = getchar();
 ch2 = getchar();
 printf("%d  %d/n", ch1, ch2);
 return 0;
    }
    程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢?
【分析】:
   
首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!
   
其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(/n)而结束的,这个/n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符/n,这样第二次的读入函数直接从缓冲区中把/n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!

----------------------------------------------------
| 
问题描述二:(分析scanf()和gets()读取字符串)   |
----------------------------------------------------
首先我们看一下scanf()读取字符串的问题:
程序2:
    #include <stdio.h>
    int main()
    {
 char str1[20], str2[20];
 scanf("%s",str1);
 printf("%s/n",str1);  
 scanf("%s",str2);
 printf("%s/n",str2);
 return 0;
    }
    程序的功能是读入一个字符串输出,在读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:

测试一输入:
Hello world!
输出:

Hello
world!
【分析】到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello world!后,字符串Hello world!都会被读到输入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,也就是第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

测试二:
Hello[Enter]
Hello[
输出]
world[Enter]
world[
输出
]
【分析】程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符!


我们再看一下gets()读取字符串的情况:
用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下:
程序3:
#include <stdio.h>
int main()
{
 
char str1[20], str2[20];
 gets(str1);
 printf("%s/n",str1);  
 gets(str2);
 printf("%s/n",str2);
 return 0;
}
测试:

Hello world! [
输入]
Hello world! [
输出
]
12345 [
输入
]
12345 [
输出
]
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Hello world! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!


--------------------------------------------------------
|
问题描述三:(getchar()暂停程序,查看程序执行结果)|
--------------------------------------------------------
    不知道大家有没有遇到过这样的问题,有的编译器程序执行完后的结果界面不会停下而是一闪就没了,以至于看不到执行结果。所以很多人在程序最后加上getchar()语句,目的是想让程序执行完后停下来,等待从终端接收一个字符再结束程序。可是发现有时候这样根本没用,程序照样跳出去了。这是为什么呢?
【分析】原因跟上面例子讲的一样,是因为输入缓冲区中还有数据,所以getchar()会成果读到数据,所以就跳出了!

 

------------------
|    
【总结】    |
------------------
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:

scanf()
以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()
以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()
以Space、Enter、Tab结束一次输入
gets()
以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
      
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
      
scanf("%[^/n]",string);

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看? 本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。 阅读详情

相关推荐

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

c语言(getchar())

getchar函数的返回值是用户输入的字符的ASCII码,只接受一个无符号的字符。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取(可接受空格)。ASCII中,大写字母=小写字母-32(代码如下)getchar()只能接收一个无符号字符。若输入多个字母,则就读取一个其他的留在缓冲区。若有循环,则等待下一个的取读。

qq_74148390的博客 1472

手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)

本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。

fern8的博客 963

关于两个scanf()或者getchar()连续使用的问题

这是我在网上找的资料,总结起来的。希望可以解决大家的问题 一: #include int main (void) {  int a, b;  puts ("请输入一个整数");  scanf ("%d", &amp;a);  puts ("再输入一个整数");  scanf ("%d", &amp;b);  printf ("a = %d b = %d\n&quot

beiguodexue优快云的博客 4773

LabVIEW 调用MATLAB 进行图像处理的实现

程机械及设备的变形、振动、冲击、粗糙度、刚度和强度等特性,还可用在土木结构、水利设施的变形测量[4][5]。因此,该技术在机械、土木、水利、电器、航空航天、兵器工业及生物医学等领域的检测中具有非常重要的地位。将物面前方空间的散斑用摄像设备记录下来,当物体运动或由于受力而变形时,这些随机分布的散斑图也随之在空间按一定的规律运动,因此能用记录的散斑图在计算机上分析物体的运动和变形,这就是电子散斑技术。当物体的漫反射表面被激光照射时,漫反射的光波在物体表面的前方相互干涉,由于漫反射光的。

qq_37971227的博客 3874

Source Insight 4.0舒适黑主题 仿心情看的舒服就行

Source Insight 4.0主题 仿心情看的舒服就行 source insight自带的主题怎么看怎么别扭,于是在试用全网各种主题配色后,在其中一个基础上自定义了c/c++的语法配色 截全图有点糊 函数定义 全局变量 局部变量 枚举变量引用 全局变量引用及结构体成员 宏定义引用 ----------------------后面会再把主题文件贴上来-------------- ...

weixin_43443402的博客 1303

C语言中getchar与scanf函数详解

getchar函数概况 我们知道getchar函数是用来读取字符的一个函数。一般与putchar(输出字符)一起使用。 下面我们来看一下getchar在MSDN上的描述。 MSDN上说getchar这个函数的返回类型是 int ,就会有人产生疑惑了,getchar读取的不是字符嘛?怎么返回了整型?这就涉及到两点: 1.返回的int是指字符的ASCII码值,所以是int类型。 2. MSDN上说,当getchar读取失败或者是读取文件结束时,会返回一个EOF。EOF也就是End Of ..

SAKURAjinx的博客 7342

UE5实战:用Cesium插件打造逼真湖泊效果(附波纹参数调优技巧)

本文详细介绍了在Unreal Engine 5中利用Cesium插件创建逼真区域水效果(如湖泊)的实战流程。重点解析了通过材质层混合机制,精细调整波纹参数(如DistanceScale、NearScale)来模拟不同水体状态,并提供了从资产创建、地形配置到视觉调优的一站式解决方案,帮助开发者高效实现非海洋水域的动态视觉效果。

weixin_29209805的博客 160

详解函数 scanf()、getchar()函数

当我们解决了上面的问题,又发现了新的情况:当我们输入的密码带有空白字符(空格符,制表符)时,不等我们从键盘上输入(Y/N)进行密码确认,直接跳出“密码确认失败”;经过上面的分析,发现没等我们从键盘上输入(Y/N)进行密码确认,rs 直接拿着获取到的字符 d ,进行密码确认校验了,所以直接跳出“密码确认失败”经过上面的分析,发现没等我们从键盘上输入(Y/N)进行密码确认,rs 直接拿着获取到的 \n,进行密码确认校验了,所以直接跳出“密码确认失败”因为在密码确认环节前缓冲区中还有其他的数据,导致问题出现。

wn147258369的博客 435

51-14 Retentive Network,RetNet 多尺度保留机制序列建模论文精读

RetNet 提出了多尺度保留机制序列建模,该机制支持三种计算范式,即并行、循环和分块循环。RetNet有更好的全局注意力建模、高效的计算效率、对遮挡的鲁棒性、支持基于注意力的图像生成、与置信度相关的门控机制和多任务学习等特点,对不同视觉任务可以共享历史注意力记忆,可以同时进行分类、分割、检测等任务。RetNet在视觉领域应该有广阔的应用前景。

AIgraphX 1614

分布式爬虫架构实战:Scrapy+RabbitMQ+浏览器池,百万级数据抓取成本直降60%(附架构图+源码)

任务调度瓶颈:Redis 作为消息队列,不支持复杂任务优先级,高并发下容易消息堆积,且单点故障会导致全量任务丢失;资源浪费严重:每个爬虫节点每次爬取动态页面都启动新浏览器,启动耗时3-5秒,CPU 占用率高达80%+,单机最多同时跑3个浏览器;扩展性差:新增节点需要手动同步任务队列,节点忙闲不均,无法根据任务量动态分配资源。# 从settings读取RabbitMQ配置# 注册信号:爬虫关闭时关闭RabbitMQ连接"""启动时建立RabbitMQ连接"""

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1619

【C语言】使用 getchar 与 scanf 出现的一些问题

在同时使用 getchar 与 scanf 时可能遇到的一些问题,不免忘了这两者在缓冲区获取数据的冲突问题

qq_73575817的博客 1330

华为OD机试双机位C卷-部门人力分配 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【部门人力分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 部门人力分配。

qq_45776114的博客 1874

深入了解scanf()/getchar()和gets()/cin等函数

转:问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序:程序1: #include <stdio.h> int main() {char ch...

老王随聊 80

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[ZZ]深入了解scanf()/getchar()和gets()等函数

原文链接:http://dev.firnow.com/course/6_system/linux/linuxjq/20100113/190113.html| 问题描述一:(分析scanf()和getchar()读取字符)   |----------------------------------------------------    scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先

砚的专栏 588

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

下一篇: 杭电1372 典型的广度优先算法
monkey1223
博客等级 码龄16年 18粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值