getchar()和getch()区别

1.   有个缓冲区影响

2.   Getch"conio.h"getchar在“iostream

3.   Getch()不会显示输入数据

1.      #include"iostream"

2.      #include"conio.h"

3.      using namespace std;

4.       

5.      void main(){

6.             char c,d;

7.             c=getch();

8.      //     cout<<c;//必须要输出才有显示输入数据

9.     }

 

  最近大家在学《数据结构》,是用C语言来实现的,昨天室友问了我个问题,为什么代码执行完了,还没看清楚输出是什么,窗口就关闭了我随口就说了句在程序最后加上个getchar()就行了。可是他加上去后还是不行……我就把getchar()换成了getch(),然后程序可以正确的暂停了。

        然后室友问了我这两个函数的区别,我也不知道,然后就上网去搜,但是得到的解释有很多,究竟什么是正确的呢?于是就这个问题我们开始写代码去验证:

        

       先看一下源代码:是书上的一个示例代码,作用是比较两个数的大小,然后显示最大值和最小值,代码如下:

C代码  

1.  #include <stdio.h>  

2.  void main()  

3.  {  

4.       int *p1,*p2,*p,a,b;  

5.       printf("请输入两个数");  

6.       scanf("%d,%d",&a,&b);  

7.       p1 =&a;p2 =&b;  

8.       if(a<b)  

9.       {  

10.             p=p1;  

11.             p1=p2;  

12.             p2=p;  

13.      }  

14.        

15.   printf("a=%d,b=%d\n\n",a,b);  

16.   printf("max=%d,min=%d\n",*p1,*p2);  

17. }  

 

       记得大一下学期做课程实验设计的时候,也遇到了相似的问题:如果要连续输入几个数据(每输一个数据就按一次回车)输入完第一个数据,然后一按回车,第二个要输入的数据就不等待用户的输入直接跳过了,当时老是说在每次输入的时候后面加上一个getchar()就可以了,我就照做了,至于为什么也没有深究,现在就让我来通过代码来解释一下他们的区别,希望对同样有这个疑问的同学有所帮助。

       首先要知道的是我们每次输入数据的时候是先向输入缓冲区写入数据,然后再被函数读取,而键盘上的回车其实是用两个字节表示的依次为 13 10  ,但是我们一般用的输入函数scanf()只检测13这个字符就判断输入结束,并且给变量赋值了。

       比如当程序执行到

       scanf("%d,%d",&a,&b);

       时,我们输入  1,2   这是缓冲区的字节是 1然后按回车,缓冲区的字节为 1   2   13   10,然后scanf()检测到 13  这个字符,并把 13  从缓冲区清除,认为用户输入已经结束,所以依次将 1 赋给  a  ,将 2 赋给,并把 1  2  从缓冲区清除。这是缓冲区只剩下回车的第二个字节 10  了。

       getchar()函数只有在缓冲区里面没有数据的时候才会等待用户输入回车作为输入结束的标志,所以如果只写一句getchar(),将会直接把 10   从缓冲区读走,而不会等待用户输入。验证代码如下:

Java代码  

1.  #include <stdio.h>  

2.  void main()  

3.  {  

4.       int *p1,*p2,*p,a,b;  

5.       int c;  

6.       printf("请输入两个数");  

7.       scanf("%d,%d",&a,&b);  

8.       c=getchar();//用来接收回车的第二个字节  

9.       p1 =&a;p2 =&b;  

10.      if(a<b)  

11.      {  

12.             p=p1;  

13.             p1=p2;  

14.             p2=p;  

15.      }  

16.        

17.   printf("a=%d,b=%d\n\n",a,b);  

18.   printf("max=%d,min=%d\n",*p1,*p2);  

19.   printf("c=%d",c);  

20.   

21.   getch();  

22. }  

编译运行后正如我所说的,c的值为10

为了进一步验证,我要在输入的时候依次输入三个字符(a,b,c),再按一次回车,设定四个getchar()去接收缓冲区的字节,缓冲区数据被依次赋给相应的变量,一共四个,所以到输出语句后面的getchar()时缓冲区应该不会有数据了,程序会等待用户输入,验证代码如下:

C代码  

1.  #include <stdio.h>  

2.  void main()  

3.  {  

4.       int *p1,*p2,*p,a,b;  

5.       int c,d,e,f,g,;  

6.       printf("请输入两个数");  

7.       scanf("%d,%d",&a,&b);  

8.       c=getchar();  

9.       p1 =&a;p2 =&b;  

10.      if(a<b)  

11.      {  

12.             p=p1;  

13.             p1=p2;  

14.             p2=p;  

15.      }  

16.        

17.   printf("a=%d,b=%d\n\n",a,b);  

18.   printf("max=%d,min=%d\n",*p1,*p2);  

19.   d=getchar();  

20.   e=getchar();  

21.   f=getchar();  

22.   g=getchar();  

23.     

24.   printf("c=%d,d=%d,e=%d,f=%d,g=%d",c,d,e,f,g);  

25.   getchar();  

26. }  


 
验证成功!

现在来说下getch(),这个函数不会自动读取缓冲区的字符,而是会直接读取用户输入的按键,比如我输入一个回车,getch()会直接读到 13  这个字节,而不会像getchar()一样把  13  当做一个输入结束的标志,并且 13 后面的 10  不会存入到输入缓冲区,验证代码如下:

C代码  

1.  #include <stdio.h>  

2.  void main()  

3.  {  

4.       int *p1,*p2,*p,a,b;  

5.       int c,d,e,f,g,h,i,j;  

6.       printf("请输入两个数");  

7.       scanf("%d,%d",&a,&b);  

8.       c=getchar();  

9.       p1 =&a;p2 =&b;  

10.      if(a<b)  

11.      {  

12.             p=p1;  

13.             p1=p2;  

14.             p2=p;  

15.      }  

16.        

17.   printf("a=%d,b=%d\n\n",a,b);  

18.   printf("max=%d,min=%d\n",*p1,*p2);  

19.   d=getchar();  

20.   e=getchar();  

21.   f=getchar();  

22.   g=getchar();  

23.     

24.   printf("c=%d,d=%d,e=%d,f=%d,g=%d",c,d,e,f,g);  

25.   h=getch();  

26.   i=getchar();  

27.   printf("h=%d,i=%d",h,i);  

28.   getch();  

29. }  

 验证输入:1,2 回车 abc回车回车回车 

 可以看到,h的值为13 而且还要再按一下回车才能让i=getchar()语句执行结束,验证成功。

 


你可能感兴趣的:(C++)