密码不回显函数(一)

来源:互联网 发布:js正则匹配多个字符串 编辑:程序博客网 时间:2024/06/05 12:45
getch getche getchar的区别和缓冲区的概念
   今天同学问我一个问题,.Net上编译C程序最后的结果总是一闪而过。记得有个函数能够实现其功能,于是分不清这几个函数之间的关系,总结一下。

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

    我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,
    如果数据源直接对数据目标发送数据的话。数据目标获得第一个字符,便将它显示。然后从端口读取下一个字符,
    可是这时就不能保证数据源向端口发送的恰好是第二个字符(也许是第三个,而第二个已经在数据目标显示时发送过了)。
    这样的话就不能保证输出的数据能完整的被数据目标所接受并处理。
      为了解决这个问题,我们需要在数据源与数据目标中间放置一个保存完整数据内容的区域,那就是 “缓冲区”。这样的话,
    数据源可以不考虑数据目标正在处理哪部分数据,只要把数据输出到缓冲区就可以了,数据目标也可以不考虑数据源的发送频率,只是从缓冲区中依次取出下一个数据。
    从而保证了数据发送的完整性,同时也提高了程序的效率。
     当然getch(),getche()没有用到缓冲区。

2.几个函数的区别

    首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时候,我们总喜欢用在程序的末尾加上它,利用它来实现程序运行完了暂停不退出的效果。
    如果不加这句话,在TC2.0的环境中我们用Ctrl+F9编译并运行后,程序一运行完了就退回到TC环境中,我们根本来不及看到结果,这时要看结果,
    我们就要按Alt+F5回到DOS环境中去看结果,这很麻烦。而如果在程序的结尾加上一行getch();语句,我们就可以省掉会DOS看结果这个步骤,
    因为程序运行完了并不退出,而是在程序最后把屏幕停住了,按任意键才退回到TC环境中去。
    那我们来看看getch()到底起的什么作用,getch()实际是一个输入命令,作用是从键盘接收一个字符,而且并不把这个字符显示出来,就是说,
    你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以我们在C++中可以用它来实现“按任意键继续”的效果,即程序中遇到getch();
    这行语句,它就会把程序暂停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。
    你也许会问,为什么我们在C++中就没有在程序的末尾加上getch(),解释是,软件总是不断更新的,不好的地方当然要进行改正,getch()加在程序末尾,
    它又不赋值给任何变量,所以它在这个地方完全是垃圾代码,与程序无关。C++中考虑到这一点,于是在每次程序运行完了并不退出,而是自动把屏幕停下来,
    并显示“press any key...”叫你按任意键退出,这就好比C++在它的环境中运行程序,在程序的末尾自动加上了一行getch();语句,
    并且在这行语句前还添加了一行输出语句cout<<"press any key...";来提示你程序结束了,按任意键继续。
    实际上我们编译好的程序在程序结束了本身是不会停下来的,我们可以在编译产生的Debug目录中找到这个编译好的应用程序(扩展名exe),在文件夹中双击运行它,
    你会发现屏幕闪了一下MS-DOS窗口就关闭了,因为程序运行完就自动退出了,回到了windows环境,当然,如果我们在DOS环境中运行这个程序,
    我们就可以直接在看到DOS屏幕上看到程序运行结果,因为程序运行完后并不清屏。但是,visual stdio.net2003有返回到了tc那样的情况,你必需要有个getch()才行。
    getche()和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示。
    就这么一点看看下面的例子:
[cpp] view plain copy
  1. #include<stdio.h>  
  2. #include<conio.h>  
  3. void main()  
  4. {  
  5.     char ch;  
  6.     for(int i=0;i<5;i++)  
  7.     {  
  8.         ch=getch();  
  9.         printf("%c",ch);  
  10.     }  
  11. }  


  首先这是个连续5次的循环来实现5次停顿,等待我们输入,我们编译并运行这个程序,假设我们分别输入abcde,屏幕上显示的结果是abcde,
    这个abcde并不是在ch=getch();中输出的,我们把printf("%c",ch);这行语句去掉,就会发现我们按5次任意键程序就结束了,但屏幕上什么都没有显示。
    然后我们在把代码中的getch()换成getche()看看有什么不同,我们还是分别输入abcde,这时屏幕上显示的结果是aabbccddee,我们把printf("%c",ch);
    这行语句再去掉看看,显示的结果就是abcde了,说明程序在执行ch=getche();这条语句的时候就把我们输入的键返回显示在屏幕上,有无回显就是它们的唯一区别。
    有人会说,既然是C的函数库中的,那么就应该淘汰了,我们还研究它,还用它干嘛?但是我发现还是有用着它的地方,否则我也不会在这里说这么多来耽误大家的时间。
    我就举个例子吧,程序如下:
[cpp] view plain copy
  1. #include<stdio.h>  
  2. #include<conio.h>  
  3. void main()  
  4. {  
  5.     char ch='*';  
  6.     while(ch=='*')  
  7.     {  
  8.         printf("/n按 * 继续循环,按其他键退出!");  
  9.         ch=getch();  
  10.     }  
  11.     printf("/n退出程序!");  
  12. }  
0 0
原创粉丝点击