//这里是举例代码。
#include
int main(void)
{
char ch;
scanf("%c", &ch);
while(ch != 'g')
{
printf("%c",ch);
scanf("%c",&ch);
}
return 0:
}
此题摘抄于C Primer plus 第六版第六章复习题第八题Go west,youn
缓冲区分为三种:
全缓冲 行缓冲 不带缓冲行缓冲:输入输出遇\n,执行I/O操作。输入字符先存放在缓存区,按下回车键才进行实际I/O操作。eg:键盘输入数据。
不带缓冲:eg:标准出错情况stderr,使出错信息尽快显示。
那么回归本体,本题涉及到标准输入即为行缓冲。scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式为只接收一个字符。那么当我们输入Go west,young man!
时实际上这些字符只是存在与缓冲区中,当我们按下回车键(\n)时,I/O操作才开始执行。此时第一个scanf执行并录入’G‘,进行循环语句判断,之后的scanf会直接从缓冲区中读入接下来的字符,因此while循环语句会自动不断执行直至遇到’g‘循环终止,退出程序。
#include
int main(void)
{
char name[20];
scanf("%s",name);
printf("%s\n",name);
}
程序执行结果:
我再啰嗦的向大家拓展一下会车符(\n)也是会被记入缓冲区的,语言没有说服力那就看看代码吧!
#include
int main(void)
{
char ch1,ch2;
printf("输入ch1:\n");
scanf("%c",&ch1);
printf("ch1:%c\n",ch1);
printf("输入ch2:\n");
scanf("%c",&ch2);
printf("ch2:%c\n",ch2);
}
程序执行结果:
这里我只输入了’a‘和回车键,可以看到ch2没有赋值(或者说赋值回车)但是当我输入’‘ab’'时
这同样也佐证了上面的道理。