getchar()的灵活使用

getchar()在C程序中的功能是接收一个字符,当我们在连续输入字符的时候getchar()会给你意想不到的效果。下面是做的一些测试:

首先看下面的这个程序:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2.  #include<stdlib.h>  
  3.  int main(void)  
  4.  {  
  5.      int a,b,c;  
  6.      printf("please input num a:\n");  
  7.      scanf("%d",&a);  
  8.      printf("please input num b:\n");  
  9.      scanf("%d",&b);  
  10.      printf("please input num c:\n");  
  11.      scanf("%d",&c);  
  12.      printf("%d,%d,%d",a,b,c);  
  13.  }  

运行结果


那么把int改成char之后会是什么结果呢?来看下一段代码:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(void)  
  4. {  
  5.    char a,b,c;  
  6.     printf("please input num a:\n");  
  7.     scanf("%c",&a);  
  8.     printf("please input num b:\n");  
  9.     scanf("%c",&b);  
  10.     printf("please input num c:\n");  
  11.     scanf("%c",&c);  
  12.     printf("%c,%c,%c",a,b,c);  
  13. }  

运行结果:


为什么会显示这样的结果?你猜到是什么原因了吗?

我们再来看一下源代码:程序连续接收了三个字符,在C中enter键代表一个换行符,所以当输入完a的值‘q’之后按下enter键,换行符立马被字符b接收了,然后程序再向下走,输入c的值‘w’。结果就会按顺序显示a,b,c的值,我们已经知道a='q',b='\n',c='w';所以结果就会显示两行。

如果我们加入getchar()会有什么结果呢?

我们再来看一下改进的程序:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2.  #include<stdlib.h>  
  3.  int main(void)  
  4.  {  
  5.      char a,b,c;  
  6.      printf("please input num a:\n");  
  7.      scanf("%c",&a);  
  8.      getchar();  
  9.      printf("please input num b:\n");  
  10.      scanf("%c",&b);  
  11.      getchar();  
  12.      printf("please input num c:\n");  
  13.      scanf("%c",&c);  
  14.      printf("%c,%c,%c",a,b,c);  
  15.  }  
运行结果:



现在为什么会正常显示我们想要的结果呢?原因就是getchar()把enter键所表示的字符接收了,所以就会达到想要的效果了。

这无非就是输入的规范问题,如果我们运行第二个程序,用另一种方法输入的结果:


这同样可以得到想要的结果。

编译器规定输入的时候并不是立即回显,而是存到一个缓冲区里面。当遇到换行字符会释放缓冲区的数据,并清空缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值