首页 > 编程知识 正文

getchar怎么用,c语言getch什么意思

时间:2023-05-06 13:04:03 阅读:173863 作者:2155

原文地址: http://blog.csdn.net/CX yol/article/details/628324

getch getche getchar的差异与缓冲区概念

今天同学问了我一个问题。 用. Net编译C程序的最后一个结果总是在闪烁。 我记得某个函数可以实现其功能,我不知道这几个函数之间的关系了,所以总结一下。

1输入输出缓冲区的概念(C++用的多一些)

我想举一个例子来说明。 例如,如果您想将文章以字符串形式输出到计算机的监视器屏幕上,我的程序存储器作为数据源,显示驱动器作为数据目标,数据源直接向数据目标发送数据。 数据目标获取第一个字符并显示它。 然后从端口读取下一个字符,但此时无法确保数据源发送到端口的正好是第二个字符。 可能是第三个字符,但第二个字符已经在显示数据目标时发送。 这样就不能保证输出的数据完全被数据目标接受和处理。

要解决此问题,必须在数据源和数据目标之间放置用于存储完整数据内容的区域,即“缓冲区”。 这样,数据源就可以将数据输出到缓冲区,而不考虑数据源正在处理的数据部分,数据源也可以在不考虑数据源发送频率的情况下从缓冲区中依次检索下一个数据。 这样可以保证数据发送的完整性,同时也提高了程序的效率。

当然,getch (),getche )没有使用缓冲区。

2几个函数的区别

首先请不要忘记。要用getch()必须引入头文件conio.h如果不输入这个词,在TC2.0的环境中用Ctrl F9编译并运行后,程序运行后返回TC环境。 我们来不及看结果。 此时,要查看结果,必须按Alt F5返回DOS环境查看结果。 这很辛苦。 在程序的末尾加上一行getch (; 语句,我们可以省去DOS查看结果的步骤。 这是因为,程序运行结束后并不结束,而是在程序末尾停止画面,按任意键返回TC环境。

那么,让我们来看看getch ) )起了什么作用。 getch ) )实际上从键盘接收字符,但不显示该字符。 也就是说,按键不会在画面上显示任何内容,而是继续执行后面的代码,所以C可以使用它实现“按任意键继续”的效果。 也就是说,在程序中,这一行暂停程序,按任意键都会在收到该字符键后继续执行以下代码。

你可能会想,为什么我们在C上不在程序的末尾加上getch (),但一解释,软件总是更新的,不好的地方当然要修改。 getch ) )加在程序的末尾,它也不会被分配给任何变量,所以在这个地方完全是垃圾代码,与程序无关。 考虑到这一点,它会自动停止屏幕,而不是在每次运行程序时退出,然后显示“press any key .”并指示您按任意键退出。 这是因为C在该环境下运行程序,在程序末尾自动添加一行getch (语句,在该语句之前输入输出语句cout'press any key . ' ); 程序结束了。 请按任意键继续。

实际上,即使程序结束,我们编译的程序也不会停止。 在编译生成的调试目录中找到此编译的APP应用程序(扩展名为exe ),然后在文件夹中双击运行,屏幕会闪烁并显示MS-DOS窗口已关闭。 程序结束后自动退出,返回windows环境。 当然,在DOS环境下运行此程序时,我们可能会发现visual stdio.net2003回到了tc。 需要getch ()。

getche()和getch (很相似,但是http://www.Sina.com),它们的区别在哪里呢? 不同之处在于,getch (没有返回显示,getche )有返回显示。 请看以下示例:

#includestdio.h

#includeconio.h

void main () )

{

char ch;

for(intI=0; i5; I )

{

ch=getch (;

printf('%c ',ch );

}

}

首先这是连续5次循环实现5次停顿,等待我们输入。 假设我们编译并运行这个程序,每个程序都输入了abcde。 屏幕上显示的结果是abcde,此abcde不是ch=getch ()。 中输出的,我们使用printf('%c”,ch ); 删除这一行后,我们会按5次任意键程序结束,但画面上什么都没有。

然后把代码中的ge

tch()换成getche()看看有什么不同,我们还是分别输入abcde,这时屏幕上显示的结果是aabbccddee,我们把printf("%c",ch);这行语句再去掉看看,显示的结果就是abcde了,说明程序在执行ch=getche();这条语句的时候就把我们输入的键返回显示在屏幕上,有无回显就是它们的唯一区别。

    有人会说,既然是C的函数库中的,那么就应该淘汰了,我们还研究它,还用它干嘛?但是我发现还是有用着它的地方,否则我也不会在这里说这么多来耽误大家的时间。我就举个例子吧,程序如下:
#include<stdio.h>
#include<conio.h>

void main()
{
    char ch='*';
    while(ch=='*')
    {
        printf("/n按 * 继续循环,按其他键退出!");
        ch=getch();
    }
    printf("/n退出程序!");
}

  我们可以在这个循环体中添加我们想要的功能,程序中按*继续循环,其他任意键退出,而且利用getch()无回显的特性,我们不管按什么,都不会在屏幕上留下痕迹,使我们的界面达到美观效果,如果还有更好的办法实现这个功能。例子:

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'.

3.如何清空输入缓冲区的内容?

    如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区,下面就介绍方法(不同平台)

C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。

对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)
// ...
char sbuf[1024];
// ...
fgets( sbuf, 1024, stdin );
// ...

在windows 的vc下面就可以这样了:

for(int i=0;i<10;++i)

{

char ch=getchar();

fflush(stdin); //每次都会有等待状态了

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。