我正在学习scanf()
如何在C中使用缓冲区。
下面是我的代码:
#include <stdio.h>
int main(void) {
char str[80];
scanf("%s", str);
printf("1st word: %s\n", str);
scanf("%s", str);
printf("2nd word: %s\n", str);
scanf("%c", &str[0]);
printf("buffer: %d\n", str[0]);
return 0;
}
字符串
我输入apple jam
作为输入。我认为第三个scanf
将占用缓冲区中的空间(' '
)。但结果却不一样。它接受了'\n'
,buffer中的换行符。
我以为结果会是这样的:
1st word: apple
2nd word: jam
buffer: 32
型
但结果是
1st word: apple
2nd word: jam
buffer: 10
型
由于第一个scanf("%s", str);
从缓冲区中取出字apple
,第二个scanf("%s", str);
从缓冲区中取出字jam
,因此我认为缓冲区仍然包含' '
和'\n'
。
所以我预计结果会是buffer: 32
。但是,第三个scanf
(scanf("%c", &str[0]);
)从缓冲区中获取换行符。
在哪里可以找到空格字符(' '
)?
1条答案
按热度按时间6tdlim6h1#
scanf("%s", str);
从标准输入中读取并丢弃任何空白字符(这会导致从终端请求输入,并且您的输入被读取为一整行,开头没有任何空白字符),然后将任何非空白字符读取到目标数组str
中。使用您的输入,您在str
中得到apple
,scanf()
返回1
成功转换,printf("1st word: %s\n", str);
输出1st word: apple
和一个换行符。下一个调用
scanf("%s", str);
做同样的事情,所以你输入的空格只是被读取和丢弃,str
接收jam
,scanf()
返回1
成功转换,printf("2nd word: %s\n", str);
输出2nd word: jam
和一个换行符。下一个
scanf("%c", &str[0]);
读取当你在apple jam
之后按回车键时输入的换行符,并将其存储到str[0]
中,这个换行符在你的系统上的值为10
,大概是使用ASCII。scanf()
返回1
,结果printf("buffer: %d\n", str[0]);
输出10
。请注意,您应该编写
scanf("%99s", str)
以避免超长输入的未定义行为,并且应该测试scanf
的返回值以检测无效或丢失的输入。