问题现象:

当程序中存在多个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)解决。

#include <stdio.h>
int main(void){
int cmd;
char ch;
float balance=0.0f, credit, debit;
for(;;){
printf("What do you want to do? 1:credit 2:debit 3:balance 4:exitn");
scanf(" %d",&cmd);
switch(cmd){
case 1:
printf("Enter amount of credit: ");
scanf("%f",&credit);
balance+=credit;
credit=0.0f;
break;
case 2:
printf("Enter amount of debit: ");
scanf("%f",&debit);
balance-=debit;
debit=0.0f;
break;
case 3:
printf("The banlance of your acoount is: %fn", balance);
break;
case 4:
printf("Exit confirm:(y/n)");
scanf(" %c",&ch);//若没有空格,则将会读入上次输入的回车键。
if(ch=='y')return 0;
else if(ch=='n')break;
else {
printf("Error command.n");
break;
}
break;
default:
printf("Error command.n");
break;
}
}
}

Scanf连续调用多次并且存在%c的问题相关推荐

  1. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

  2. mockito 多层调用_连续调用的Mockito迭代器样式存根

    mockito 多层调用 Sometimes we want to mock different responses for the consecutive calls on the same met ...

  3. 关于接口连续调用,查询数据库数据不一致的情况

    关于接口连续调用,查询数据库数据不一致的情况 在后端开发中为前端提供了一个上传图片的接口,并且允许上传多张,虽然我封装了数组,但是前端依然是一张一张进行上传的,例如上传三照片,那么就调用三次接口,就是 ...

  4. C++ 成员函数连续调用

    使用 c++ 一些表示灵活数据体的对象时,经常会看到形如 a.reshape({1, 2}).add(1) 这样连续的成员函数调用,这是怎么实现的呢?其实很简单,只需要让需要被连续调用的成员函数最后返 ...

  5. c语言怎么同时输入两个字符,解决C语言中使用scanf连续输入两个字符类型的问题...

    昨天用C编程,遇到一个关于scanf的细节问题,假如运行如下程序: #include int main() { char ch1,ch2; printf("Input for ch1:/n& ...

  6. 连续调用两次socket函数

    note_2019_05_07 在一个进程的一个函数中连续调用socket函数赋值给两个不同的SOCKET类型变量,第二个调用socket的变量总是INVALID_SOCKET,不知是何原因. 解决方 ...

  7. cocos creator moveTo 或者moveBy 连续调用问题

    cocos creator moveTo或moveBy  连续调用多次,会出现移动不到想要的目标位置,总是会超过目标位置很远,因为第二次移动的会以第一次移动的为基准,所以会多出第一次移动的那一段距离, ...

  8. c语言如何用循环输入字符串,C语言使用scanf连续输入字符串出现的问题

    #include int main() { char a,b; scanf("%c",&a): scanf("%c",&b); printf(& ...

  9. C语言scanf连续输入两个字符

    C语言scanf函数连续输入两个字符出现的问题 上代码 //初始代码,输入1,2,a,b,每次输入按了一次回车 int a,b; char c,d; scanf("%d%d",&a ...

最新文章

  1. 数学推导+纯Python实现机器学习算法12:贝叶斯网络
  2. python 封装时间常用操作方法-time,datetime
  3. 为什么我的论文没人引用?
  4. n型半导体和p型半导体的区别_王煜JMCA: N, P掺杂碳负载的PtP2纳米颗粒自转化为核壳型Pt/PtP2:一种高效和稳定的ORR催化剂...
  5. 晓庄学院计算机科学分数,南京晓庄学院计算机单招分数
  6. Exec l 中分列的作用
  7. ZOJ Problem Set - 1009
  8. 我的第九个java程序--spring和mybatis整合(java project)
  9. 手淘适配-flexible
  10. 6月16日!蒋江伟深度解读基础云产品生态战略 | 凌云时刻
  11. c语言程序设计徐立辉答案,C语言习题
  12. 使用MATLAB进行二次规划求解最优值
  13. Matlab中的数据类型
  14. [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)
  15. 计算机大二学生个人总结报告,计算机学生大二第二学期自我总结计划自我总结计划.doc...
  16. 项目上线质量如何评估
  17. 【金融案例分析03】深度解读:光大证券乌龙指事件是怎么回事?(套利交易、基金背后的金融原理,事件的过程与定性)
  18. 2022-01-28 Android app 背景图首尾相接滚动效果,ImageView 滚动显示效果
  19. SSH远程操作——一台电脑的的NAS之旅
  20. 奥利给!2020年10月程序员工资最新统计,涨了!!!

热门文章

  1. 【简便解法】1084 Broken Keyboard (20 分)_16行代码AC
  2. 【详细注释】1051 Pop Sequence (25 分)
  3. 21行代码AC_ 试题H: 修改数组【解题报告】
  4. sql超低级用法(防遗忘)
  5. html-loader无效,html-loader加载失败
  6. mysql5.5安装最后一步一直无反应_【MATLAB R2019b】保姆级安装教程
  7. OpenStack的部署T版(七)——cinder模块
  8. c语言程序转换成单片机语言,单片机编程常用到的类型转换 C语言程序实现
  9. bootstrap4 左侧导航栏 优秀 大气_Axure导出html没有左侧菜单栏(导航栏)?——Mac Safari...
  10. todo已完成任务_重要主干街路已完成清雪任务