有关getche getch getc getchar几个函数的区别

时间:2022-01-01 01:50:49
getc(): 
调用方式:int getc(FILE *stream) 
它返回指定输入流stream的当前位置的下一个字符,并增加文件的位置指示器. 

getch(): 
调用方式:int getch(void) 
getch()从控制台读取一个字符,但不把该字符显示在屏幕上,也就是不回显. 

getche(): 
调用方式:int getche(void) 
getchar()从控制台读取一个字符,把该字符显示在屏幕上,也就是回显. 

getchar(): 
调有方式:int getchar(void) 
getchar()从控制台读取一个字符,并回显,它和getch(),getche()的不同在于,它等到输入一个回车才结束,就算你输入了一个字符串,它也只取其中的第一个字符. 





void main()

     char c, ch;
     c=getch();     /*
从键盘上读入一个字符不回显送给字符变量
c*/
     putchar(c);    /*
输出该字符
*/
     ch=getche();   /*
从键盘上带回显的读入一个字符送给字符变量
ch*/
     putchar(ch);
     printf("/n/n");
}

    值得注意的是前面两个函数都是从键盘读入数据!

    还有getchar是很值得研究的:getchar()stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了。而getch()getche()conio.h中的库函数,它的作用是从键盘接收字符。getchar带有显示。

    与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束(前提是缓冲区没有数据),回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。

#include<stdio.h>
#include<conio.h>
void main()
{
     char c;
     c=getchar();   /*
从键盘读入字符直到回车结束
*/
            //getchar()
在这里它只返回你输入字符串的第一个字符,并把返回值赋值给
c
     putchar(c);    /*
显示输入的第一个字符
*/
     printf("/n/n");
}

例四:呵呵,这个程序你运行一下,相信你又会有疑问了。这个就是从缓冲区中读取了例子。第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。

#include<stdio.h>

#include<conio.h>

void main()

{

    char c;

    while ((c=getchar())!='/n')    /*每个getchar()依次读入一个字符*/

        printf("%c",c);        /*按照原样输出*/

    printf("/n/n");

}

 

程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这里怎么?

因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。

例子中循环条件里的'/n'实际上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循环,当然意思是如果你输入12345a213123/n”那么只会输出到a,结果是12345a

再次注意:getchar()它是从中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符,上面举过例子了),如果流队列不为空,执行getchar()就继续放水,直到把回车符也放空为止,空了之后再在执行getchar()就停下等待你的输入了;我们用getch()为什么每次都是等待用户的输入呢?因为getch()是从键盘接收,即时的接收,并不是从stdin流中去读取数据。

    补充:按键盘上的回车产生了2个字符:回车符('/r')和换行符('/n')。回车符'/r'(CR:carriage return:倒车)使光标回到这行的首部,换行符('/n')(new line)然后再换行。

    所以当输入字符'w',并按下回车键以后。首先得到回车符。那个getchar函数结束了。 但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的'/n'.