`
jcs130
  • 浏览: 131377 次
  • 性别: Icon_minigender_1
  • 来自: Ottawa
社区版块
存档分类
最新评论

探究C语言中的getchar()与getch()的区别

 
阅读更多

 

        最近大家在学《数据结构》,是用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()语句执行结束,验证成功。

 

 

  • 大小: 8 KB
  • 大小: 7.4 KB
分享到:
评论

相关推荐

    C语言中getchar和gets区别

    ### C语言中getchar和gets的区别 在C语言编程中,`getchar()`与`gets()`是两个常用函数,它们分别用于从标准输入流(通常是键盘)读取单个字符和整个字符串。虽然这两个函数都能从键盘接收输入,但它们的工作方式、...

    getchar与getch的区别

    getchar与getch的区别,详细剖析了这两者之间的区别,深入浅出,容易理解。推荐!!!

    getchar和getch的区别

    getchar、getch和getche函数都是C语言中的输入函数,但是它们之间存在着一些重要的区别。getchar函数等待用户按回车键,然后从stdio流中读入一个字符;getch函数直接从键盘获取键值,不等待用户按回车键;getche函数...

    C语言中getchar, gets, 和 scanf 三种不同函数的区别

    在C语言中,getchar、gets和scanf是三个常见的输入函数,它们各自有着特定的用途和特点。在理解和使用这些函数时,理解它们之间的差异至关重要,以确保代码的安全性和效率。 首先,`getchar()` 函数是用于读取单个...

    C语言中的getchar和putchar的使用方法

    C语言中的getchar和putchar的使用方法 getchar是以行为单位进行存取的。 当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D)...

    c语言中getch,getche,getchar的区别

    在C语言中,`getch()`、`getche()` 和 `getchar()` 都是用来从标准输入设备(通常是键盘)获取字符的函数,但它们的行为和用途有所不同。 首先,`getchar()` 函数是C标准库 `&lt;stdio.h&gt;` 中的一员。它的主要功能是从...

    C语言中getchar()的返回类型为什么是int详解

    C语言中getchar()的返回类型为什么是int详解 C语言中getchar()函数的返回类型为什么是int,这是一个常见的问题。在学习C语言时,我们经常遇到这种问题。其实,getchar()函数的返回类型之所以是int,是因为它需要...

    C语言getchar详细解释和示例

    在C语言中,`getchar()` 是一个非常基础且实用的函数,用于从标准输入(通常是键盘)读取单个字符。它定义在 `&lt;stdio.h&gt;` 标准输入输出库中,因此在使用 `getchar()` 之前,需要包含这个头文件。下面我们将详细讨论 ...

    getch()、getche()与getchar()的区别与联系.doc

    在C语言编程中,输入和输出是我们经常遇到的操作。`getch()`、`getche()`和`getchar()`是三个常用的从标准输入设备(通常是键盘)读取字符的函数,它们各自有不同的特性和用途。 首先,`getch()`函数的作用是从键盘...

    c++中 getch()、getche()和getchar()之间的区别

    C++中 getch()、getche()和 getchar()之间的区别 C++ 中的 getch()、getche() 和 getchar() 是三个常用的输入函数,但是它们之间的区别和联系经常让人困惑。今天我们来详细分析它们之间的区别和联系。 首先,让...

    getch()和getchar()

    getch()和getchar()都是从键盘读取一个字符的函数,但是它们之间存在一些关键的区别。 getchar()函数 getchar()函数是从键盘读取一个字符的函数,它的返回值是用户输入的第一个字符的ASCII码。如果出错,返回-1。...

    getchar是C语言中的一个标准库函数.docx

    getchar是C语言中的一个标准库函数,以下是关于getchar的详细介绍: 一、功能 getchar函数的主要功能是从标准输入(通常是键盘)读取一个字符,并将其作为int类型返回。这个函数通常用于从键盘获取用户输入。 二、...

    基于C语言EOF与getchar()的使用详解

    以前在看K&R的The C Programming Language(SecondEdition)第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多...

    getchar与putcharf的区别

    C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常...

    C语言学习-getchar的使用PDF

    1.getchar 当输入终端在默认的输入模式(cooked)下时getchar 是以行为单位进行存取,EOF(Unix/Linux下为组合键Ctrl+D)有两种作用,一个是换行符,一个是结束符。当缓冲区有其它字符时,它只是一个换行符,当前面没有...

    SCANF和GETCHAR的区别,GETCHAR的妙用

    在C语言中,处理输入输出的函数很多,其中scanf和getchar都是常用的输入函数,但它们的用途和特点各不相同。scanf是一种格式化输入函数,它可以按照用户指定的格式从标准输入读取数据,并将读取的数据存放到指定的...

Global site tag (gtag.js) - Google Analytics