如果想直接看解决办法,直接点击目录中的结果处

文章目录

  • 前言:
    • 问题:
      • 原因:
      • 尝试改进:
    • 新问题:
      • 原因:
      • 最后解决办法:
        • 思路:
      • 结果

前言:

我想大家在做一些PTA题的时候,有的时候需要输入多行字符,例如:

A    B
C   D
W   Q

在这些多行输入中如果使用scanf的%c来格式输入时:

int main()
{char ch1, ch2;for (int i = 0;i < 3;i++) {scanf("%c %c", &ch1, &ch2);//char a = getchar();printf("ch1=%c\n", ch1);printf("ch2=%c\n", ch2);}
}

问题:


可以看到如果scanf("%c %c", &ch1, &ch2); 输入时有的字符为空

原因:

因为在cmd中每行我们输入完了该输入下一行时会使用回车
然后鸡贼的scanf也把回车当成了一个字符给了我们的变量

尝试改进:

那咋办么,我想输入多行字符,那scanf又要截取我的回车。。。(那我就让他截取)没错,这个时候你一定想到了在每次输入时在scanf中加入\n比如:

scanf("%c %c\n",&a, &b);

新问题:

然后你会发现特扯的事情:当你输入第一行时,你发现此时应该输出的值没有输出,
你输入第二行的时候,输出的值是第一行的值,最恶心心的来了:当你输入完三行后按回车发现程序不会退出(图中蓝色部分是我狂按回车)但是随便输入一个值后再按回车我们才能看到第三行的输出与程序的退出
(没错,此时的你一定更我一样百思不得其解,差点当场自闭)

原因:

我查了好多博客等相关资料,得到的解释是:

  1. 先理解scanf的输入:
    我们输入的数据是先存放在“缓冲区”,可以把它理解为一个队列。输入数据从队列的右端进入,而scanf读取数据是从队列的左端取出。注意:与格式控制符不匹配的数据还停留在缓冲区中。
  2. 接下来看什么程序只有在输入一个无效的字符,回车后才能退出
    当我键盘录入 ‘ %c %c\n ’的时候,输入的前两个字符会被读取到并且赋值给变量,后面的回车会被scanf拿去 (看看这不就是我们要做的吗 )
    但是问题就在于:此时缓冲区里是一片空白,然而程序结束需要读到缓冲区里任意一个回车才可以结束。
    但是我不是输入了很多空格么? 这个是scanf读取有效字符的问题:比如,scanf要读取到有效的整型,会跳过开头的一切回车和空白,直到遇到整型才会纳入赋值给相应变量,然后再遇到回车才会结束这条语句。所以接着刚问题,缓冲区中是空白的时候,就是给一万个\n ,scanf语句会把它视为开头的空白,是不会读取的,所以要加入一点东西,跳过这个开头的空白,再给回车才有效果。所以它才会一直等待你输入一点东西。

最后解决办法:

听完我在上上面的解释后,你发现你还是不知道如何解决这种让你吐血的问题(嘿嘿):

思路:

思路与原来相同就是想办法把没用的回车给吸收了:
使用getchar()就可以了(因为吸收了回车,所以没有必要在scanf中写\n)

int main()
{char ch1, ch2;for (int i = 0;i < 3;i++) {scanf("%c %c", &ch1, &ch2);char a = getchar();//为了吸收多余的回车字符printf("ch1=%c\n", ch1);printf("ch2=%c\n", ch2);}
}

结果

关于c语言中 scanf 对多行字符的输入问题相关推荐

  1. c语言多组输入字符,关于c语言中 scanf 对多行字符的输入问题

    如果想直接看解决办法,直接点击目录中的结果处 文章目录 前言: 问题: 原因: 尝试改进: 新问题: 原因: 最后解决办法: 思路: 结果 前言: 我想大家在做一些PTA题的时候,有的时候需要输入多行 ...

  2. c语言中scanf(%d%*c, n);的意思

    c语言中scanf("%d%*c", &n);的意思. 2018年07月22日 17:08:00 韩小妹 阅读数:3274 scanf()中%*表示忽略掉一个输入项.上面的 ...

  3. C语言中scanf()函数中的是什么

    困惑初学者的C语言中scanf()函数中的&到底是什么 对于初学者而言,肯定有过这样一个困惑:为什么在使用scanf函数输入数据时有时需要在参数前加一个&,而有时却不用. 在回答&qu ...

  4. scanf在c语言中的作用,c语言中scanf的基本用法

    前言 scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单: 1 int a; 2 scanf("%d",&a); ...

  5. C语言-在scanf表示什么,在c语言中scanf代表什么意思?

    在c语言中scanf代表什么意思? 发布时间:2020-04-24 14:04:21 来源:亿速云 阅读:370 作者:小新 今天小编给大家分享的是在c语言中scanf代表什么意思,相信很多人都不太了 ...

  6. c语言scanf中 作用,c语言中scanf的用法

    c语言中scanf的用法的用法你知道吗?下面小编就跟你们详细介绍下c语言中scanf的用法的用法,希望对你们有用. c语言中scanf的用法的用法如下: printf和scan函数的使用方法 一 pr ...

  7. C语言中Scanf语句的注意事项

    C语言中Scanf语句的注意事项共有五条. 1.Scanf遇到错误会自动停止,直接执行下一行. 2.当使用多个scanf接受数据时,可以加\n,防止回车被赋值到第二个scanf中. 如: 3.如果在s ...

  8. java字符型常量可以改变_在JAVA语言中,下列正确的字符型常量是

    在JAVA语言中,下列正确的字符型常量是 答:'9' 智慧职教: 引发COVID-19疾病的新冠病毒的核酸类型是(? ? ? ). 答:RNA 仍然是长期制约我国经济社会发展的关键性问题之一 答:人口 ...

  9. C语言中scanf和gets

    目录 scanf()的说明和使用 gets()的说明和使用 scanf("%s")和gets()的区别 关于~和EOF scanf()的说明和使用 scanf(完整函数为int s ...

最新文章

  1. 介绍Windows Server服务器角色、角色服务和功能
  2. java 连接池实例_功能完善的Java连接池调用实例
  3. [蓝桥杯][算法训练VIP]暗恋(二维树状数组)
  4. Win32编程之基于MATLAB与VC交互的多项式回归
  5. 解决C语言程序报错:return type defaults to‘int’
  6. Shell命令-磁盘与文件系统之e2fsck、mkswap
  7. Encapsulate Field
  8. 如何快速排查生产问题
  9. 用IoT放羊养牛,不出门也能知道它们的动向
  10. Java基础学习总结(94)——Java线程再学习
  11. 正则表达式,json表达式
  12. String类常用方法
  13. tabbar角标 小程序_小程序tabbar实现底部tab导航栏
  14. 夏普Sharp AR-C260M PS 一体机驱动
  15. 操作系统--虚拟内存
  16. 利用ViewPager和WheelView实现横向纵向轮番滚动
  17. 最长子序列DP和二分法
  18. Golang实习蓝湖二面
  19. 密码朋克的社会实验(一):开灯看暗网
  20. java基础学习之this和super和内存结构

热门文章

  1. 揪心的问题-f2py
  2. 11. 旋转数组的最小数字(剑指 Offer 题解Java版)
  3. 运营商业务系统基于 KubeSphere 的容器化实践
  4. 面板显示技术:LCD与OLED
  5. 阿里云服务器ESSD云盘吞吐量IOPS及性能级别PL0、PL1、PL2和PL3参数说明
  6. python中的pep_Python的PEP文档是什么?
  7. 为没有历史的互联网留下历史——闪客帝国回忆录
  8. 答大二软件工程专业学生——重点学什么
  9. The Tomcat connector configured to listen on port 8082 failed to start
  10. python中formatter的用法_Python pyplot.FuncFormatter方法代码示例