c语言getchar的不赋任何变量,探究C语言中的getchar()与getch()的差别

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

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

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

#include

void main()

{

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

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

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

p1 =&a;p2 =&b;

if(a

{

p=p1;

p1=p2;

p2=p;

}

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

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

}

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

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

比如当程序执行到

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

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

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

#include

void main()

{

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

int c;

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

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

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

p1 =&a;p2 =&b;

if(a

{

p=p1;

p1=p2;

p2=p;

}

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

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

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

getch();

}

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

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

#include

void main()

{

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

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

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

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

c=getchar();

p1 =&a;p2 =&b;

if(a

{

p=p1;

p1=p2;

p2=p;

}

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

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

d=getchar();

e=getchar();

f=getchar();

g=getchar();

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

getchar();

}

1618342090.jpg

验证成功!

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

#include

void main()

{

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

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

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

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

c=getchar();

p1 =&a;p2 =&b;

if(a

{

p=p1;

p1=p2;

p2=p;

}

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

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

d=getchar();

e=getchar();

f=getchar();

g=getchar();

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

h=getch();

i=getchar();

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

getch();

}

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

1618342091.jpg

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值