scanf的输入问题
//这里是举例代码。
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c", &ch);
while(ch != 'g')
{
printf("%c",ch);
scanf("%c",&ch);
}
return 0:
}
- 此题摘抄于C Primer plus 第六版第六章复习题第八题
当我们输入Go west,young man!时程序的运行结果是:Go west,youn
在弄清此题之前有必要先弄清计算机的输入输出与缓存区问题:计算机的标准输入stdin输出stdout并不是直接读取键盘里的数据,而是从缓冲区里读入数据。那么什么是缓冲区呢?缓冲区解释:即一块内存区,用在输入输出设备和cpu之间,用来缓存数据,是低速的输入输出设备和高速的cpu能协调工作,解放CPU,使其高效工作。
缓冲区分为三种:
- 全缓冲
- 行缓冲
- 不带缓冲
全缓冲:填满标准I/O缓存后才进行实际I/O操作。
即一次I/O操作就是一次请求,对于磁盘,一次I/O操作就是读或写磁盘某段扇区,读写完毕,I/O结束。eg:磁盘文件读写。
行缓冲:输入输出遇\n,执行I/O操作。输入字符先存放在缓存区,按下回车键才进行实际I/O操作。eg:键盘输入数据。
不带缓冲:eg:标准出错情况stderr,使出错信息尽快显示。
那么回归本体,本题涉及到标准输入即为行缓冲。scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式为只接收一个字符。那么当我们输入Go west,young man!
时实际上这些字符只是存在与缓冲区中,当我们按下回车键(\n)时,I/O操作才开始执行。此时第一个scanf执行并录入’G‘,进行循环语句判断,之后的scanf会直接从缓冲区中读入接下来的字符,因此while循环语句会自动不断执行直至遇到’g‘循环终止,退出程序。
- 同理%s也是如此,但是在使用%s时我们要注意一个问题,那就是空格问题。在使用%s输入字符时,若遇到空格(space)那么后面的字符将不在录入。看个例子
#include<stdio.h>
int main(void)
{
char name[20];
scanf("%s",name);
printf("%s\n",name);
}
程序执行结果:
我再啰嗦的向大家拓展一下会车符(\n)也是会被记入缓冲区的,语言没有说服力那就看看代码吧!
#include<stdio.h>
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’'时
这同样也佐证了上面的道理。
- 以上就是我个人对scanf以及%c %s 的输入问题和缓冲区问题的看法,以上说明仅代表我个人观点,如有错误以及说明不恰当的地方欢迎各位批评指正,有问题也可以私信我,我们一起探讨解决。如有喜欢的欢迎各位关注我的博客,大家可以相互学习。