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

getchar()用来接收输入的字符串,输入一个字符就回显一个,直到遇到回车键或空格才停止接收输入(C语言中判断是否键入回车键: if(presskey == '\r') 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("\nYou input a '%c'\n",ch);
    return 0;
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }Linux Example:

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

注:

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

char pwd[MAX_PWD] = {0};

//打印地址

int i = 0;

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

{

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

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

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

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

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

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

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

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

}

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

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

改成如下即可:

int j = 0;

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

C控制台密码输入:输入一个字符显示一个星号的更多相关文章

  1. wordpress登录密码框明文显示最后一个输入的字符

    wordpress登录密码框明文显示最后一个输入的字符 (function(a){a.fn.dPassword=function(c){var e={interval:200,duration:100 ...

  2. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  3. [SQL]当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0

    ISNUMERIC ( expression ) 当输入表达式得数为一个有效的整数.浮点数.money 或 :否则返回 .返回值为 确保可以将 expression 转换为上述数字类型中的一种. 注意 ...

  4. 华为oj-判断输入的字符串是不是一个有效的IP地址

    题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...

  5. spring boot 实现密码连续输入错误5次,限制十分钟内不能进行登录

    我们要实现的就是,密码连续输入错误5次,就限制用户十分钟不能进行登录. 大致的流程图 数据库设计如下 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ...

  6. java 中的控制台端口的输入

    java 中基于控制台端的输入时最基本的操作. 第一步 导入Scanner类 import java.util.Scanner; 第二步 创建输入对象 input Scanner input=new ...

  7. nginx配置访问密码,输入用户名和密码才能访问

    1. 安装 htpasswd 工具 yum install httpd-tools -y 设置用户名和密码,并把用户名.密码保存到指定文件中: [sandu@bogon conf]$ sudo mkd ...

  8. easyui-validatebox 验证两次密码是否输入一致

    验证两次密码是否输入一致 $.extend($.fn.validatebox.defaults.rules, {        /*必须和某个字段相等*/        equalTo: { vali ...

  9. Linux就这个范儿 第12章 一个网络一个世界

    Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus  OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...

随机推荐

  1. LINUX:关于Redis集群搭建 、和搭建项目中遇到的问题

    文章来源:http://www.cnblogs.com/hello-tl/p/7804225.html 0.Redis的简单安装 1.安装redis依赖 # yum install gcc tcl g ...

  2. MySQL 存储 utf8mb4

    1.如果是阿里云数据库 a.控制台->修改参数character_set_server参数为UTF8mb4 b.设置库的字符集为UTF8mb4 2.如果是自己mysql服务器 [client] ...

  3. vs2017编译boost 1.70.0

    目前最新版本的boost库是1.70.0.现在在学习使用cinatra搭建c++的http服务器,需要用到boost库中的asio,下载了一下最新版本的boost库,捣鼓了半天. 1.下载 boost ...

  4. ELK的简单安装使用

    ELK ELK是什么? Elasticsearch LogStash Kibana     1,简单的安装 我采用的是本地window环境: 下载的包如下:   首先安装的是jdk8,安装完成之后,设 ...

  5. C#与Ranorex自动化公用方法

    原创 - C#与Ranorex自动化公用方法 利用c#在Ranorex上写自动化已经有很长的一段时间了,总结发现常用的方法不外乎如下几种: 1.打开浏览器:或者app public static vo ...

  6. 生产环境下lnmp的权限说明

    https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...

  7. CSU 1307 最短路+二分

    题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或 ...

  8. 洛谷P2527 [SHOI2001]Panda的烦恼

    题目描述 panda是个数学怪人,他非常喜欢研究跟别人相反的事情.最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都是质数,不过panda对这些不感兴趣,他只对被筛掉 ...

  9. 一致性哈希算法-----> 解决memecache 服务器扩容后的数据丢失。

    1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...

  10. win8,win10里面内置的IE浏览器网银无法输入密码

    win8,win10里面内置的IE浏览器网银无法输入密码,安装控件也没效果,部分网银直接导致IE崩溃,只需要简单设置即可解决. 方法/步骤   1 打开IE浏览器,点击右上角的小齿轮图标,在下拉菜单中 ...