博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C】getchar()在C程序中的妙用!
阅读量:5152 次
发布时间:2019-06-13

本文共 1665 字,大约阅读时间需要 5 分钟。

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

首先看下面的这个程序:

1 #include
2 #include
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之后会是神马结果呢?来看下一段代码:

1 #include
2 #include
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()会有什么结果呢?

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

1 #include
2 #include
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键所表示的字符接收了,所以就会达到想要的效果了。

到现在你应该明白为什么会出现这种情况了吧!无非就是输入的规范问题,如果我们运行第二个程序,用另一种方法输入看看会是神马效果:

看到没?也可以获取想要的结果,但是程序并不是这么美观了,为什么会出现这种效果呢?

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

scanf()在读取数字时会跳过空格、制表符和换行符!

转载于:https://www.cnblogs.com/ngnetboy/archive/2012/11/06/2756534.html

你可能感兴趣的文章
Xamarin Visual Studio不识别JDK路径
查看>>
菜鸟“抄程序”之道
查看>>
Ubuntu下关闭防火墙
查看>>
TCP/IP 邮件的原理
查看>>
w3m常用快捷键
查看>>
【Unity 3D】学习笔记四十一:关节
查看>>
原型设计工具
查看>>
windows下的C++ socket服务器(4)
查看>>
css3 2d转换3d转换以及动画的知识点汇总
查看>>
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
js对象属性方法
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
利用Git版本控制管理你的项目
查看>>
windows下使用pycharm开发基于ansible api的python程序
查看>>
错误 warning: LF will be replaced by CRLF in README.md.
查看>>
Linux CentOS7 httpd 配置注释
查看>>
Sqlserver2012 评估期已过问题
查看>>
C#调用C++DLL/天地伟业解码器二次开发
查看>>
zend framework 1 连接oracle数据库的写法
查看>>
APUE学习笔记:第九章 进程关系
查看>>