c语言中关于scanf输入与%c和%s的使用问题(附带缓冲区讲解)

scanf的输入问题

 //这里是举例代码。
#include 
int main(void)
{
	char ch;
	scanf("%c", &ch);
	while(ch != 'g')
	{
		printf("%c",ch);
		scanf("%c",&ch);
	}
	return 0}

  1. 此题摘抄于C Primer plus 第六版第六章复习题第八题
    当我们输入Go west,young man!时程序的运行结果是:Go west,youn
    在弄清此题之前有必要先弄清计算机的输入输出与缓存区问题:计算机的标准输入stdin输出stdout并不是直接读取键盘里的数据,而是从缓冲区里读入数据。那么什么是缓冲区呢?

    缓冲区解释:即一块内存区,用在输入输出设备和cpu之间,用来缓存数据,是低速的输入输出设备和高速的cpu能协调工作,解放CPU,使其高效工作。

缓冲区分为三种:

  1. 全缓冲
  2. 行缓冲
  3. 不带缓冲
    全缓冲:填满标准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
int main(void)
{
	char name[20];
	scanf("%s",name);
	printf("%s\n",name);
}

程序执行结果:c语言中关于scanf输入与%c和%s的使用问题(附带缓冲区讲解)_第1张图片

我再啰嗦的向大家拓展一下会车符(\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);
}

程序执行结果:
c语言中关于scanf输入与%c和%s的使用问题(附带缓冲区讲解)_第2张图片
这里我只输入了’a‘和回车键,可以看到ch2没有赋值(或者说赋值回车)但是当我输入’‘ab’'时c语言中关于scanf输入与%c和%s的使用问题(附带缓冲区讲解)_第3张图片
这同样也佐证了上面的道理。

  • 以上就是我个人对scanf以及%c %s 的输入问题和缓冲区问题的看法,以上说明仅代表我个人观点,如有错误以及说明不恰当的地方欢迎各位批评指正,有问题也可以私信我,我们一起探讨解决。如有喜欢的欢迎各位关注我的博客,大家可以相互学习。

你可能感兴趣的:(c语言,c语言)