zoukankan      html  css  js  c++  java
  • C控制台密码输入:输入一个字符显示一个星号

    要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar()

    getchar()用来接收输入的字符串,输入一个字符就回显一个,直到遇到回车键或空格才停止接收输入(C语言中判断是否键入回车键: if(presskey == ' ') printf("yes"); )

    再如scanf()也是带回显的。要实现输入一个字符回显一个星号的结果,我们在这里采用kbhit()函数和getch()函数来做,先对这两个函数做个介绍:

    kbhit()

    函数名称: kbhit() (vc++6.0下为 _kbhit())

    函数功能:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0.

    用法:int kbhit(void)

    包含头文件:include<conio.h>

    返回值说明: 当kbhit()函数检测到有键盘输入时,它会返回一个非0值,注意这个返回的非零值,并不是对应键位所对应的ASCII码值,所以这个值除了通过它为非零判断有键盘输入以外,不能用来做其它用途。实际上,只要有键盘输入它都返回一个固定的非零值。

    getch()

    函数名称:getch()

    函数功能:在win平台下从控制台无回显地取一个字符,在Linux下是有回显的。

    包含头文件:win平台下是 conio.h  linux平台下 curses.h

    用法:

    int getch(void);

    在linux下(需包含curses.h)还应该在使用函数之前使用initscr(),使用完毕之后调用endwin().否则的话不输入就会返回。

    返回值:从键盘上读取到的字符。

    Win Example:

    #include <stdio.h>
    #include <conio.h>
     
    int main(void)
    {
        char ch;
        printf("Input a character:");
        ch = getch();
        printf("
    You input a '%c'
    ",ch);
        return 0;
    }

    Linux Example:

    #include <stdio.h>
    #include <curses.h>
     
    int main(void)
    {
        char ch;
        initscr();
        printw("Input a character:");
        ch = getch();
        printw("
    You input a '%C'
    ",ch);
        endwin();
        return (0);
    }
    为了能完成输入一个字符显示一个星号, 我们通过kbhit()函数来检测是否有键盘输入,一旦检测到键盘输入,则调用getch()来获取键盘输入的字符,如果输入的不是' '即回车键,那么就存入到数组中,否则 break 退出密码输入函数。
    输入一个字符就显示一个星号,getLine()具体实现如下:
    char *getLine(char *buf,int len)
    {
        int i = 0;
        char ch;
        fflush(stdin);
        while(i<len-1)
        {
            if(0 != kbhit()){//检测到有键盘输入
                ch = getch();//读取键盘输入赋值给ch
                //c中 
     才是代表 回车符
                if(ch == '
    ') break; //如果是回车键则退出while循环结束密码输入
                putchar('*');
                buf[i] = ch;//存入接收密码的字符数组中
                ++i;
            }
        }
        buf[i] = '';
        return buf;
    }

    注:

    C打印数组地址和字符数组的值 使用%s 会报内存访问错误!例如

    char pwd[MAX_PWD] = {0};

    //打印地址

    int i = 0;

    for(i = 0; i < MAX_PWD;i++)

    {

    //下面两句用 %s 打印的语句将报内存访问错误:OxC00000005 访问越界

    printf("value: %s ",pwd[i]);

    printf("address: %s ",&pwd[i]);

    //换成用 %d 打印则可以正常打印出来,其中value显示为对应字符的ASCII码值,address 显示为16进制地址值

    printf("value: %d ",pwd[i]);

    printf("address: %d ",&pwd[i]);

    //也可以通过%c 来打印value值, 这样它就直接显示存储的字符

    printf("value : %c ",pwd[i]);

    }

    此外注意在C语言中i变量的声明不能放在for循环中,如下声明则会报找不到变量j,

    for(int j = 0; j<MAX_PWD;j++)

    改成如下即可:

    int j = 0;

    for(j = 0; j<MAX_PWD;j++)

  • 相关阅读:
    manjora20安装搜狗输入法
    manjora20使用体验
    deepin20体验
    deepin20搜狗输入法使用
    deepin20使用snap并设置代理
    C#服务器端使用office组件
    华为多屏互动看学英语
    ThinkPad S5立体声混响以及语音识别
    mate10碎屏机当成小电脑使用尝试
    刷机错误ERROR:STATUS_BROM_CMD__FAIL
  • 原文地址:https://www.cnblogs.com/AI-Algorithms/p/3393179.html
Copyright © 2011-2022 走看看