我有以下程序:
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d", &a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%c", &c1); // line 3
printf("Enter another char: ");
scanf("%c", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
正如我在 C 书上看到的,作者说 scanf()
在缓冲区中留下了一个换行符,因此程序不会停在第 4 行供用户输入数据,而是将新行字符存储在 c2
中并移动到第 5 行。
是这样吗?
但是,这是否只发生在 char
数据类型上?因为我没有看到第 1、2、3 行中 int
数据类型的问题。对吗?
最佳答案
scanf()
函数在尝试解析字符以外的转换之前自动跳过前导空格。字符格式(主要是 %c
;还有扫描集 %[…]
— 和 %n
)是异常(exception);他们不会跳过空格。
使用带有前导空格的 "%c"
来跳过可选的空格。不要在 scanf()
格式字符串中使用尾随空白。
请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行尾,所以如果同时使用 getchar()
时请注意这一点。或 fgets()
在同一个输入流上。我们只是让 scanf 跳过空格 before 转换,就像它对 %d
和其他非字符转换所做的那样。
请注意,除了转换之外的非空白“指令”(使用 POSIX scanf terminology ),例如 scanf("order = %d", &order);
中的文字文本不会跳过空白要么。文字 order
必须匹配要读取的下一个字符。
因此,如果您想从上一行跳过换行符,但仍需要对固定字符串 like this question 进行字面匹配,您可能需要 "order = %d"
.
关于c - scanf() 将换行符留在缓冲区中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47501834/