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

为何C语言中scanf()忽略前导空白却遇尾随空白终止字符串读取?

关于scanf("%s")的行为疑问

测试代码

char str[20];
scanf("%s", str);
printf("%s", str);

输入输出示例

  • 输入1: Hi(输入内容前带有若干空格)
    输出:Hi
  • 输入2:Hello World
    输出:Hello

问题

为何C语言中的scanf()会忽略所有前导空白字符,却在遇到任意尾随空白时终止字符串读取?


解答

这是scanf里%s格式说明符的既定设计规则,核心是为了满足"读取单个连续非空白字符序列(即单词)"的常见需求:

  1. 忽略前导空白:%s在开始读取前,会自动跳过所有前置的空白字符(空格、换行、制表符等),直到碰到第一个非空白字符才启动读取逻辑。这是因为很多输入场景里,前导空白属于无关的分隔符(比如用户误输入的空格、换行残留的空格),不需要被当作有效内容。
  2. 遇空白终止读取:一旦开始读取字符,%s会持续读取直到遇到空白字符为止,此时停止读取并把已读取的非空白字符存入目标数组(自动补加\0作为字符串结束标记)。这是因为%s的设计目标就是提取"单词",而在C语言的常规语境中,空白字符就是单词的天然分隔符。

如果需要读取包含空白的整行内容,别用scanf("%s"),改用fgets()这类函数更合适。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:52:04