问题现象:

当程序中存在多个scanf时,针对第一个scanf的输入,一般用户会以空白字符(空格、换行、tab、换页符)等结束。但若后面有一个scanf(“%c”,&ch),则刚才输入的空白字符会被此次的scanf读入,因此空白字符也是一个字符,此将导致ch为空。

原因解释:

scanf的工作原理:(一般情况,即格式串中没有其它字符)用户的任何输入将被保存在缓冲之中,当有scanf时,scanf则从此缓冲队列中读取字符,直至遇到空白字符或者是此字符不可能是本次的输入为止,并把此字符放回原队列,此字符成为队列的第一个字符。当下一次scanf被调用时,将从第一个字符读取,若此时为%d,%f,%g,%e等数据格式串,则可跳过空白字符,直至出现数字为止;若此时为%c等字符(串)格式串,则会把空白字符读入,并给此变量赋值。

另外,若读取到不可能是本格式串所代表的字符时,程序将异常退出。如scanf(“%d”,&num)时,输入kk。

解决方法:

处理格式串中的普通字符,scanf采取的动作依赖于这个字符是否为空白字符。

l 空白字符:当在格式串中遇到一个或多个连续的空白字符时,scanf从输入中重复读取空白字符直至遇到一个非空白字符(把该字符放回原处)为止。格式串中的空白字符的数量无关紧要,格式串中的一个空白字符可以与输入中任意数量(包括0个)的空白字符相匹配。

l 其它字符:当在格式串中遇到非空白字符时,scanf将把它与下一个输入字符进行比较。如果两个字符相匹配,那么scanf会放弃输入字符而继续处理格式串。如果两个字符不匹配,那么scanf会把不匹配的字符放回输入中,然后异常退出。例如,scanf(“%d/%d,&a,&b),输入是5/96,则a=5,b=96。

归纳总结:

(1)若格式串中没有其它字符,则读入可能是本变量的所有输入,直至明显不是本变量的输入。且非字符类型的格式串(如%d,%f,%g,%e)会跳过所有空白字符寻找第一个字符输入,但字符类型的格式串(如%c)不会跳过空白字符。

(2)若格式串中有其它字符,则分为空白字符与非空白字符讨论。

因此,上述问题可以使用scanf(“ %c”,&ch)解决。

C-Scanf连续调用多次并且存在%c的问题的更多相关文章

  1. 连续调用scanf的问题总结

    对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1.多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scan ...

  2. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  3. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

  4. 连续调用inet_ntoa打印出错的问题

    近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...

  5. 【JavaScript】 模拟JQuery的连续调用函数

    连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; ...

  6. WPF Loaded事件连续调用两次的问题

    最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇 ...

  7. scanf连续输入字符,中间不要忘记\n

    #include <stdio.h> int main(void) { int precipitating; int temperature; printf("\nInput p ...

  8. Qt根据汉字生成位图,可连续调用,生成的位图不会有杂点

    void MainWindow::drawText(int font_size, QString str, int n){ QPainter p; QSize size(460, font_size) ...

  9. Javascript如何避免连续调用中取到不存在的属性而导致报TypeError错?

    背景: 在最近的 NODEJS 项目中,涉及到数据库的查询,回调函数里返回了查询结果,我这样做处理然后返回给前端: return results.collect_coupon[0].count 但是这 ...

随机推荐

  1. luogu P1440 求m区间内的最小值

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...

  2. 【树形dp】Computer

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. [PKUSC2018]真实排名

    [PKUSC2018]真实排名 题目大意: 有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\).定义一个人的排名为\(n\)个人中成绩不小于他的总人 ...

  4. JDK源码学习笔记——HashSet LinkedHashSet TreeSet

    你一定听说过HashSet就是通过HashMap实现的 相信我,翻一翻HashSet的源码,秒懂!! 其实很多东西,只是没有静下心来看,只要去看,说不定一下子就明白了…… HashSet 两个属性: ...

  5. JVM 参数配置及详解 -Xms -Xmx -Xmn -Xss 调优总结

    堆大小设置 JVM 中最大堆大小有三方面限制: ①.相关操作系统的数据模型(32-bt还是64-bit)限制; ②.系统的可用虚拟内存限制; ③.系统的可用物理内存限制. 32位系统 下,一般限制在1 ...

  6. Codeforces Beta Round #1 C. Ancient Berland Circus 计算几何

    C. Ancient Berland Circus 题目连接: http://www.codeforces.com/contest/1/problem/C Description Nowadays a ...

  7. 椭圆曲线加密算法(ECC)原理和C++实现源码(摘录)

    /* 1.用户A选定一条适合加密的椭圆曲线Ep(a,b)(如:y2=x3+ax+b),并取椭圆曲线上一点,作为基点G. 2.用户A选择一个私有密钥k,并生成公开密钥K=kG. 3.用户A将Ep(a,b ...

  8. SONY新的圈铁耳机

    最近IFA大会上推出的新旗舰XBA-Z5,镁合金外壳.镀银OFC线,做工比当前的圈铁旗舰XBA-H3上明显好了不止一个档次,让人心动不已.不知道有没有改善XBA-H3的佩戴舒适度的问题.本次并没有发布 ...

  9. Unity-EasyTouch插件之ReservedArea的运用(主要是避免JoyStick与Touch的矛盾)

    昨天有人问我,easytouch插件中有个小bug,其实也不算是bug,插件的设计者早就考虑到这样的情况. 他说同时用easyjoystick和easytouch会发生,移动摇杆的时候,touch(触 ...

  10. soap-学习

    1. SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息. 简单的说:SOAP是用于访问网络服务的协议. 2. 什么是SOAP SOAP 指简易对象访问协议 SOAP ...