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

C语言scanf缓冲区疑问:输入的空格字符为何未被读取?

为什么scanf("%c")读取到的是换行符而非预期的空格?

核心问题出在scanf("%s")的默认行为上:%s格式符会自动跳过所有前导空白字符(空格、换行、制表符等),只读取连续的非空白字符,直到遇到下一个空白字符时停止,且不会移除这个终止用的空白字符。

咱们拆解你输入apple jam并按下回车后的完整执行流程:

  • 实际输入到缓冲区的内容是:apple jam\n(\n是换行符,ASCII 10)
  1. 第一个scanf("%s", str):
    直接读取apple,遇到空格时停止,此时缓冲区剩余内容: jam\n(开头是你以为会留下的空格)
  2. 第二个scanf("%s", str):
    首先自动跳过前导的空格(这就是空格“消失”的关键),然后读取jam直到遇到换行符\n停止,此时缓冲区只剩\n
  3. 第三个scanf("%c", &str[0]):
    %c不会跳过任何字符,直接读取缓冲区第一个剩余字符,也就是\n,所以输出的ASCII值是10

如果想验证那个空格的存在,可以修改代码捕获它:

#include <stdio.h>

int main(void) {
    char str[80];
    char ch;

    scanf("%s", str);
    printf("1st word: %s\n", str);
    // 读取第一个%s后的空格
    scanf("%c", &ch);
    printf("buffer char: %d (space)\n", ch);
    scanf("%s", str);
    printf("2nd word: %s\n", str);
    // 读取最后的换行符
    scanf("%c", &ch);
    printf("buffer char: %d (newline)\n", ch);
    return 0;
}

输入apple jam后会输出:

1st word: apple
buffer char: 32 (space)
2nd word: jam
buffer char: 10 (newline)

内容的提问来源于stack exchange,提问作者주재원

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:27