scanf的格式字符串加入\n的诡异事件
今天在学习scanf函数时有一个意外发现,如图。
点开运行后会出现这样的现象。
可以看出输入数字后按回车并没有出现“实收金额”而是进行了换行。
这是为什么呢?
通过网上查阅资料得知:
处理格式串中的普通字符时,scanf函数采取的动作依赖于这个字符是否为空白字符。
摘自:
https://www.cnblogs.com/demon90s/p/7469320.html
那么什么是“空白字符”呢?
空白符 通常指:
空格符“ ”, 回车符“\r”, 换行符 “\n”, 制表符 “\t”
它们的ASCII 码值 不同,分别为 十进制 32 13 10 9。
作为控制键 使用 时,控制作用 不同。
空格符 打字机打印头横走一格。制表符,横走跳到下一档。
回车符 打字机打印头横向回到本行最左处。
换行符 打字机打印头 向下走到下一行。
其它,编码小于 32 的 字符,都是不可见字符,也可当 空白符,也可当 控制键,例如 ‘\a’ 码值7,
是响铃符,取决于编译器。
摘自:https://zhidao.baidu.com/question/367689504166795764.html
如果scanf函数输入的是空白符会如何呢?
当在格式串中遇到一个或多个连续的空白字符时,**scanf函数从输入中重复读空白字符直到遇到一个非空白字符(并把该字符“放回原处”)为止。
**格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配,包括0个
也就是说:
格式串中,由于遇到了空白字符’\n’,因此还会“重复读空白字符直到遇到一个非空白字符为止”,由于输入缓冲已经没有字符可读了,因此将阻塞等待,直到读入了一个非空白字符为止。
摘自:
https://www.cnblogs.com/demon90s/p/7469320.html
再通俗易懂的讲:
此处的\n不表示等待换行符,而是读取并放弃连续的空白字符
你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。
但请注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。
摘自:
https://bbs.****.net/topics/391972570
所以我们需要将scanf函数的格式字符串中的\n去掉整个代码才可以正常运行:
正确写法
以及我们想要的效果:
总结:scanf函数的格式字符串中最好不要加入空白字符,否则会导致程序阻塞直到遇到(输入)非空白字符为止。