最近大家在学《数据结构》,是用C语言来实现的,昨天室友问了我个问题,为什么代码执行完了,还没看清楚输出是什么,窗口就关闭了我随口就说了句“在程序最后加上个getchar()就行了。”可是他加上去后还是不行……我就把getchar()换成了getch(),然后程序可以正确的暂停了。
然后室友问了我这两个函数的区别,我也不知道,然后就上网去搜,但是得到的解释有很多,究竟什么是正确的呢?于是就这个问题我们开始写代码去验证:
先看一下源代码:是书上的一个示例代码,作用是比较两个数的大小,然后显示最大值和最小值,代码如下:
#include <stdio.h>
void main()
{
int *p1,*p2,*p,a,b;
printf("请输入两个数");
scanf("%d,%d",&a,&b);
p1 =&a;p2 =&b;
if(a<b)
{
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 <stdio.h>
void main()
{
int *p1,*p2,*p,a,b;
int c;
printf("请输入两个数");
scanf("%d,%d",&a,&b);
c=getchar();//用来接收“回车”的第二个字节
p1 =&a;p2 =&b;
if(a<b)
{
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 <stdio.h>
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<b)
{
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();
}
验证成功!
现在来说下getch(),这个函数不会自动读取缓冲区的字符,而是会直接读取用户输入的按键,比如我输入一个回车,getch()会直接读到 13 这个字节,而不会像getchar()一样把 13 当做一个输入结束的标志,并且 13 后面的 10 不会存入到输入缓冲区,验证代码如下:
#include <stdio.h>
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<b)
{
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 回车 回车 回车
可以看到,h的值为13 而且还要再按一下回车才能让i=getchar()语句执行结束,验证成功。
相关推荐
C语言中getchar和 gets的区别。
getchar与getch的区别,详细剖析了这两者之间的区别,深入浅出,容易理解。推荐!!!
虽然这个问题很简单,但是估计很多人不会在意他们的区别,本人做了一个小小的总结,希望能帮到大家!
getchar和gets和scanf区别 getchar 用于单个字符,gets(不推荐)用于字符串,而 scanf 用于各种不同的数据类型,通常需要使用格式字符串来指定输入的格式。在现代C编程中,推荐使用更安全的函数来代替 gets,如 ...
C语言中的getchar和putchar的使用方法 getchar是以行为单位进行存取的。 当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D)...
主要给大家介绍了关于C语言中getchar()的返回类型为什么是int的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
getchar是C语言中的一个标准库函数,用于从标准输入(通常是键盘)读取一个字符,并返回该字符的ASCII码值。如果读取失败或遇到文件结束符EOF,则返回-1。 运行示例程序,当用户输入一个字符后,程序会输出该字符的...
getche() 和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示
以前在看K&R的The C Programming Language(SecondEdition)第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多...
getch()、getche()与getchar()的区别与联系
getch()和getchar()的区别
C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常...
c++中 getch()、getche()和getchar()总是大家迷惑的知识点 这里有他们之间的区别与联系 值得分析研究啊
29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存...
一般情况下,我们可以将getchar函数与其他输入输出函数配合使用,实现对用户输入的处理。例如,可以使用一个循环来连续调用getchar函数,直到读取到特定字符为止。也可以将读取到的字符存储到变量中,以便进一步处理...
c语言中各种输入函数应该注意的地方,c语言中的scanf、getchar,gets、getche、getch。等函数的用法和区别。