scanf函数%c前为什么加空格才能正常输出

#include <stdio.h>
int main (void) 
{
	int i ;
	char ch ;
	
	scanf("%d",&i) ;
	scanf(" %c",&ch) ;	//这行的%C前有个空格
	printf("i = %d\nch = %c\n", i, ch) ; 
	
	/* 	输入100 y 后的输出结果:
		i = 100
		ch = y */
	
	return 0 ;
}

 

前面有空格,表示读一字符前要跳过 前面 所有 的空白字符(空格,表格键,回车换行键等,有多少跳多少)后才读入1个实质性的 (字母数字符号)字符

 

有些朋友或许会有疑问,为什么 scanf(" %c",&ch) 中的%c 前面要加一个空格,空格的作用到底是什么…在这里可以告诉大家,%c前面的空格就是用来屏蔽空白符的,但想要弄明白这个问题,必须要知道C语言 scanf() 函数的特性,以及scanf()与缓冲区、标准输入流之间的联系。 但在此之前,我们先介绍两个专业术语。

1、缓冲区

   缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。

2、标准输入流

   标准输入流(stdin)是文件指针,scanf()就是从标准输入流或许数据。 在以后的文章中,会接触到fscanf函数的介绍中详细解释。

   以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符(\n)一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符,如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。

   如果能理解上面一段话,那么你应该知道%c前空格的作用了,如果不能,请看看%c前不加空格程序的输出结果。

#include <stdio.h>


int main (void)

{

int i ;

char ch ;


scanf("%d",&i) ;

scanf("%c",&ch) ;

printf("i = %d\nch = %c\n", i, ch) ;


/* 输入100 :

i = 100

ch = */


return 0 ;

}

 

   请看上面的程序,我们输入100后,咦,怎么程序中止了,马上输入结果了? 但真的是终止了吗?别忘了,标准输入流中除了100外,还有一个换行符'\n'。 第一次scanf()读取了100后,把'\n'留在了标准输入流,第二个scanf()就从输入流中获取换行符了,由于scanf()函数的特性,空白符直接忽略,因此程序便结束了,第二个scanf()函数看似失效,实际上是执行完毕了。

如果曾经按过键盘,输入流中有回车键等残余信息,%c就会读进来。 例如: scanf("%d",&x); // 有残余回车键 printf("Do you .....\n"); scanf("%c",&a); // 读入残余回车键

 所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。读到这,大家应该理解了吧?

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值