如果一个scanf的格式串以\n结尾,那么在读取完后还会阻塞等待,比如:

 int a;
scanf("%d\n", &a);

这种情况,输入一个数字然后敲下回车后,程序还是阻塞着的。为什么呢?

处理格式串中的普通字符时,scanf函数采取的动作依赖于这个字符是否为空白字符(回车、tab、空格)。

  如果是空白字符。当在格式串中遇到一个或多个连续的空白字符时,scanf函数从输入中重复读空白字符直到遇到一个非空白字符(把该字符“放回原处”)为止。格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配,包括0个。

  scanf("%d\n", &a)中的\n不表示等待换行符,而是读取并放弃连续的空白字符,你输入一个数之后,它是不会立即显示的,要等再接收到一个非空白字符(空格、制表符、回车)的输入scanf语句才结束。但请注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。

  格式串中的'\n'、‘tab’、‘空格’都属于空白字符,因此当遇到‘\n’时,程序会重复读空白字符直到遇到一个非空白字符为止”,由于输入缓冲已经没有字符可读了,因此将阻塞等待,直到读入了一个非空白字符为止。当程序阻塞的时候,我们直接按下回车,程序还是继续阻塞,只有当我们输入一个非空白字符并按下回车时程序才能继续向下执行。

  如果格式串是scanf("%c",..),那么%c会将空白字符读入并且成功返回。

  scanf读取数值类型时用若用回车结束输入,那么会在缓冲区中留下'\n',当下面紧接着一个读取字符类型的函数(比如scanf("%c",b),或者gets())

'\n'将会被读取。造成程序错误,这个问题必须引起注意。如果第一个scanf读取的是数值类型,例如scanf("%d", &num),而紧接着的scanf也是读取的数值类型,则缓冲区的回车会被忽略,可以成功读取后面的数值。因为,缓冲区中的回车是属于字符,只有读取字符时才会把它当成一个有效的输入。

scanf格式化中的\n的更多相关文章

  1. (Go)06. Printf格式化输出、Scanf格式化输入详解

    Print.Println .Printf .Sprintf .Fprintf都是fmt 包中的公共方法,在需要打印信息时需要用到这些函数,那么这些函数有什么区别呢? Print: 输出到控制台(不接 ...

  2. scanf 格式化字符串详解

    scanf格式控制的完整格式: %     *     m     l或h     格式字符 ①格式字符与printf函数中的使用方式相同,以%d.%o.%x.%c.%s.%f.%e,无%u格式.%g ...

  3. java 时间格式化中的模式字母

    java日期格式化中的模式字母有特定的意义,由于没有注意,今天在做工程的时候导致出现了奇怪的日期: 错误写法如下: 然而得到了错误的结果: 正确写法如下: 这样就得到了正确的结果 mm指的是分钟,MM ...

  4. scanf函数中*修饰符的作用,如:%*d

    在scanf函数中,*修饰符可以跳过所在项的输入.如下: #include <stdio.h> int main() { ; printf("请输入:"); scanf ...

  5. 在scanf函数中占位符使用错误而产生的一些错误

    出现的问题 在做编程题的的时候,遇到了一个很奇怪的错误,出问题的代码如下: 1 #include <cstdio> 2 using namespace std; 3 4 int main( ...

  6. scanf()格式化输入

    scanf();有种带[]的格式化输出方式 此格式控制符的基本格式为:%[scanfset] #include<stdio.h> int main() { char str[100] ; ...

  7. 关于C#时间格式化中的“f”

    示例: DateTime.Now.ToString("yyyyMMddHHmmssfff") 上面的示例就是将日期格式化到毫秒级.那么问题来了,格式化到微秒级.纳秒级怎么整?f又是 ...

  8. PhpStorm 格式化中花括号缩进方式

    格式化前: function func() { return ; } 格式化后: function func() { return ; } 在PhpStorm中的配置:File -> Setti ...

  9. C/C++ scanf 函数中%s 和%c 的简单差别

    首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf.getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取).另外特别注意键盘上 ...

随机推荐

  1. Jenkins + Ant + Jmeter 对项目的接口进行CI持续集成的配置 外加发送邮件 sendEmail

    Step1:安装Jenkins,从指定git上拉代码[安装步骤忽略] Step2:在项目安装的linux server上安装Ant 和Jmeter,我都安装在了自己的目录上,如下图 Step3:编写b ...

  2. vue饿了么学习笔记(1)vue-cli开启项目

    一.vue-cli介绍 vue-cli是vue的脚手架工具 ---->  帮助写好vue.js基础代码的工具: ① 搭建目录结构 ② 进行本地调试 ③ 进行代码部署 ④ 热加载 ⑤ 进行单元测试 ...

  3. XML_CPP_资料_libXml2_01_Code_ZC(?.pro)

    ZC:最下面有 ?.pro文件的设置写法 ZC: Win7x64,qt-opensource-windows-x86-msvc2010_opengl-5.3.2.exe,cn_visual_studi ...

  4. [html]webpack网页开发打包工具

    官方文档:https://webpack.js.org/concepts/ 中文文档:https://doc.webpack-china.org/guides/installation/ 简书简介:h ...

  5. [ios]object-c math.h里的数学计算公式介绍

    参考:http://blog.csdn.net/yuhuangc/article/details/7639117 头文件:<math.h> 1. 三角函数  double sin (dou ...

  6. Codeforces 496D - Tennis Game

    496D - Tennis Game 思路:枚举每个t,求出对应的满足条件的s. 代码: #include<bits/stdc++.h> using namespace std; #def ...

  7. Lua中数组的学习

    --数组的大小是不固定的 --一维数组的逻辑结构是线性表索引从1开始 array1 = {"Lua", "Tutorial"} , do print(array ...

  8. 链表排序 Sort List

    2018-08-11 23:50:30 问题描述: 问题求解: 解法一.归并排序 public ListNode sortList(ListNode head) { if (head == null ...

  9. mybatis: 多对多查询[转]

    加入3个包 log4j-1.2.17.jar mybatis-3.3.0.jar mysql-connector-java-5.1.8.jar log4j需要配置 log4j.properties # ...

  10. 雷林鹏分享:C# 文件的输入与输出

    C# 文件的输入与输出 一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合.当打开文件进行读写时,它变成一个 流. 从根本上说,流是通过通信路径传递的字节序列.有两个主要的流:输入流 和 ...