C语言scanf缓冲区疑问:输入的空格字符为何未被读取?
为什么
scanf("%c")读取到的是换行符而非预期的空格? 核心问题出在scanf("%s")的默认行为上:%s格式符会自动跳过所有前导空白字符(空格、换行、制表符等),只读取连续的非空白字符,直到遇到下一个空白字符时停止,且不会移除这个终止用的空白字符。
咱们拆解你输入apple jam并按下回车后的完整执行流程:
- 实际输入到缓冲区的内容是:
apple jam\n(\n是换行符,ASCII 10)
- 第一个
scanf("%s", str):
直接读取apple,遇到空格时停止,此时缓冲区剩余内容:jam\n(开头是你以为会留下的空格) - 第二个
scanf("%s", str):
首先自动跳过前导的空格(这就是空格“消失”的关键),然后读取jam直到遇到换行符\n停止,此时缓冲区只剩\n - 第三个
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,提问作者주재원
相关产品推荐
相关产品推荐

