为何C语言中scanf()忽略前导空白却遇尾随空白终止字符串读取?
关于scanf("%s")的行为疑问
测试代码
char str[20]; scanf("%s", str); printf("%s", str);
输入输出示例
- 输入1:
Hi(输入内容前带有若干空格)
输出:Hi - 输入2:
Hello World
输出:Hello
问题
为何C语言中的scanf()会忽略所有前导空白字符,却在遇到任意尾随空白时终止字符串读取?
解答
这是scanf里%s格式说明符的既定设计规则,核心是为了满足"读取单个连续非空白字符序列(即单词)"的常见需求:
- 忽略前导空白:
%s在开始读取前,会自动跳过所有前置的空白字符(空格、换行、制表符等),直到碰到第一个非空白字符才启动读取逻辑。这是因为很多输入场景里,前导空白属于无关的分隔符(比如用户误输入的空格、换行残留的空格),不需要被当作有效内容。 - 遇空白终止读取:一旦开始读取字符,
%s会持续读取直到遇到空白字符为止,此时停止读取并把已读取的非空白字符存入目标数组(自动补加\0作为字符串结束标记)。这是因为%s的设计目标就是提取"单词",而在C语言的常规语境中,空白字符就是单词的天然分隔符。
如果需要读取包含空白的整行内容,别用scanf("%s"),改用fgets()这类函数更合适。
内容的提问来源于stack exchange,提问作者Blender Stuffs
相关产品推荐
相关产品推荐

