为什么多个 `\n` 字符不会出现在标准输入流中?
Why doesn't multiple `\n` characters end up in the standard input stream?
这个问题一直困扰着我。考虑以下程序:
#include <stdlib.h>
#include <stdio.h>
int main(void){
char one,mid,final;
int num;
printf("Enter the first character:\n");
scanf("%c",&one);
printf("Enter any integer:\n");
scanf("%d",&num);
printf("Enter the middle character:\n");
scanf("%c",&mid);
printf("Enter the final character:\n");
scanf("%c",&final);
printf("You have entered\n");
printf("\"%c\" and \"%d\" and \"%c\" and \"%c\"\n",one,num,mid,final);
return EXIT_SUCCESS;
}
假设输入是
A\n
34\n
B\n
这里,
第一个 scanf
获得 A
并在 stdin
中留下 \n
。
2nd 不消耗 \n
,因为 %d
跳过它们,因此得到 34。这个 scanf
也留下 \n
stdin
.
中的字符
3rd scanf
得到第二个 scanf
.
剩下的 \n
第 4th scanf
得到 B
并再次将 \n
留在 stdin
.
我的问题是:为什么最后一个 scanf
不消耗第一个 scanf
留下的 \n
字符?
跳过的字符不在流中 "left"。输入流只能在一个方向上读取一次,1 所以一旦一个字符被跳过,它就消失了。
1 没有额外的幻想,比如缓冲
这个问题一直困扰着我。考虑以下程序:
#include <stdlib.h>
#include <stdio.h>
int main(void){
char one,mid,final;
int num;
printf("Enter the first character:\n");
scanf("%c",&one);
printf("Enter any integer:\n");
scanf("%d",&num);
printf("Enter the middle character:\n");
scanf("%c",&mid);
printf("Enter the final character:\n");
scanf("%c",&final);
printf("You have entered\n");
printf("\"%c\" and \"%d\" and \"%c\" and \"%c\"\n",one,num,mid,final);
return EXIT_SUCCESS;
}
假设输入是
A\n
34\n
B\n
这里,
第一个 scanf
获得 A
并在 stdin
中留下 \n
。
2nd 不消耗 \n
,因为 %d
跳过它们,因此得到 34。这个 scanf
也留下 \n
stdin
.
中的字符
3rd scanf
得到第二个 scanf
.
剩下的 \n
第 4th scanf
得到 B
并再次将 \n
留在 stdin
.
我的问题是:为什么最后一个 scanf
不消耗第一个 scanf
留下的 \n
字符?
跳过的字符不在流中 "left"。输入流只能在一个方向上读取一次,1 所以一旦一个字符被跳过,它就消失了。
1 没有额外的幻想,比如缓冲