为什么scanf的%d后加空格时读取输入次数超出预期?
问题原因
scanf 格式串中的空白字符(空格、\n、\t 等)的匹配规则是:连续读取并丢弃输入流中所有的空白字符,直到遇到第一个非空白字符才会结束当前空白符的匹配。
你代码中循环内使用的格式串是 "%d ",%d 后额外加了一个空格,执行逻辑如下(以 n=3 为例):
- 第一次调用
scanf:%d成功匹配你输入的第一个整数,接下来匹配格式串末尾的空格,此时你输入整数后按下的回车属于空白字符,会被直接丢弃,直到你输入第二个整数(第一个非空白字符),空格匹配结束,第一次scanf执行完成返回。 - 第二次调用
scanf:逻辑和第一次一致,%d匹配第二个整数,末尾空格需要读到第三个非空白输入才会结束匹配。 - 第三次调用
scanf:%d匹配第三个整数后,末尾的空格还需要匹配到下一个非空白字符才会结束,所以程序会要求你输入第四次内容,只要你输入任意非空白内容,第三次scanf就会返回。这多出来的第四次输入的非空白内容只会触发匹配结束,不会被%d读取,所以 ptr 数组里保存的还是前三次输入的整数,赋值结果符合预期。
解决方法
直接去掉格式串末尾的空格,改为 scanf("%d", &ptr[i]); 即可。因为 %d 格式说明符本身就会自动跳过输入流中位于整数前的所有空白字符,不需要额外加空格来处理换行。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

