C语言scanf格式串末尾多余空格导致程序阻塞问题咨询
问题原理说明
C语言scanf函数对格式化字符串中的空白字符(空格、制表符\t、换行符\n等)存在固定的处理规则:
格式化字符串中出现的任意空白字符,会指示scanf匹配输入流中任意数量的连续空白字符,直到匹配到非空白字符才会停止该段空白符的匹配逻辑。
你出错的代码中scanf("%d %d ", &a, &b);的格式化字符串末尾多了一个空格,执行流程如下:
- 输入
1 2加回车时,前两个%d分别匹配到1、2完成对变量a、b的赋值,格式串中间的空格也已经匹配到1和2之间的输入空格 - 接下来需要处理格式串末尾的空格,此时
scanf会持续跳过输入流中后续的所有空白字符(包括你输入2后按下的回车),必须等到你输入一个非空白字符,才会判定末尾空格的匹配完成,结束本次scanf调用继续执行后续代码。
这就是你必须额外多输入一个非空白字符才能让程序继续运行的原因。
当你修改为scanf("%d %d", &a, &b);后,格式化字符串在第二个%d匹配完成后就结束了,不需要等待后续非空白字符的输入,程序自然就能正常运行。
补充:该问题不是末尾空格独有的,如果格式化字符串末尾写的是
\n、\t这类空白字符,都会触发相同的卡住问题。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

