You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么scanf的%d后加空格时读取输入次数超出预期?

问题原因

scanf 格式串中的空白字符(空格、\n、\t 等)的匹配规则是:连续读取并丢弃输入流中所有的空白字符,直到遇到第一个非空白字符才会结束当前空白符的匹配。

你代码中循环内使用的格式串是 "%d ",%d 后额外加了一个空格,执行逻辑如下(以 n=3 为例):

  1. 第一次调用 scanf:%d 成功匹配你输入的第一个整数,接下来匹配格式串末尾的空格,此时你输入整数后按下的回车属于空白字符,会被直接丢弃,直到你输入第二个整数(第一个非空白字符),空格匹配结束,第一次 scanf 执行完成返回。
  2. 第二次调用 scanf:逻辑和第一次一致,%d 匹配第二个整数,末尾空格需要读到第三个非空白输入才会结束匹配。
  3. 第三次调用 scanf:%d 匹配第三个整数后,末尾的空格还需要匹配到下一个非空白字符才会结束,所以程序会要求你输入第四次内容,只要你输入任意非空白内容,第三次 scanf 就会返回。这多出来的第四次输入的非空白内容只会触发匹配结束,不会被 %d 读取,所以 ptr 数组里保存的还是前三次输入的整数,赋值结果符合预期。

解决方法

直接去掉格式串末尾的空格,改为 scanf("%d", &ptr[i]); 即可。因为 %d 格式说明符本身就会自动跳过输入流中位于整数前的所有空白字符,不需要额外加空格来处理换行。

内容的提问来源于stack exchange,提问作者Aditya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:07