C控制台密码输入:输入一个字符显示一个星号
要在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);
}
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控制台密码输入:输入一个字符显示一个星号的更多相关文章
- wordpress登录密码框明文显示最后一个输入的字符
wordpress登录密码框明文显示最后一个输入的字符 (function(a){a.fn.dPassword=function(c){var e={interval:200,duration:100 ...
- 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。
创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...
- [SQL]当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0
ISNUMERIC ( expression ) 当输入表达式得数为一个有效的整数.浮点数.money 或 :否则返回 .返回值为 确保可以将 expression 转换为上述数字类型中的一种. 注意 ...
- 华为oj-判断输入的字符串是不是一个有效的IP地址
题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...
- spring boot 实现密码连续输入错误5次,限制十分钟内不能进行登录
我们要实现的就是,密码连续输入错误5次,就限制用户十分钟不能进行登录. 大致的流程图 数据库设计如下 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ...
- java 中的控制台端口的输入
java 中基于控制台端的输入时最基本的操作. 第一步 导入Scanner类 import java.util.Scanner; 第二步 创建输入对象 input Scanner input=new ...
- nginx配置访问密码,输入用户名和密码才能访问
1. 安装 htpasswd 工具 yum install httpd-tools -y 设置用户名和密码,并把用户名.密码保存到指定文件中: [sandu@bogon conf]$ sudo mkd ...
- easyui-validatebox 验证两次密码是否输入一致
验证两次密码是否输入一致 $.extend($.fn.validatebox.defaults.rules, { /*必须和某个字段相等*/ equalTo: { vali ...
- Linux就这个范儿 第12章 一个网络一个世界
Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...
随机推荐
- react深入 - 手写实现react-redux api
简介:简单实现react-redux基础api react-redux api回顾 <Provider store>把store放在context里,所有子组件可以直接拿到store数据 ...
- C++:别名 / 引用 的简单实用
文章来源:http://www.cnblogs.com/hello-tl/p/7910048.html /* C++别名操作 在更改别名的时候同时变量也会跟着改变 */ #include " ...
- [MVC]Ajax辅助方法
在开始使用Ajax辅助方法前,必须在页面中载入jQuery以及jquery.unobtrusive-ajax.js文件才能正常执行. 为了让网站载入适当的JS函数库,必须先让Layout页面载入适当的 ...
- C# CreateDataTable
public DataTable CreateDataTable() { DataTable dataTable = new DataTable(); ...
- 【转】关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说你的理解有点片面,那么到底什么 ...
- android GET 请求在5.0版本的取不到数据,报IO异常兼容问题解决
使用lib类库xUtils-2.6.10.jar作为数据请求的框架,在android的5.0版会有兼容问题,取不到GET请求的数据. 但是POST没有问题,难取到数据. public static R ...
- 【转载】js中对象的使用
原文链接:http://www.jb51.net/article/90256.htm[侵删] 简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一 ...
- Python高级进阶(一)Python框架之Django入门
传说中的Django Django由来 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下 ...
- P2835 刻录光盘
洛谷—— P2835 刻录光盘 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会 ...
- sqlite中常见的问题总结
一.sqlite中不能使用日期进行相减,执行结果无效 例如:SELECT count(*) as cnt FROM DayBanalces WHERE (date(ofDay)- date('2013 ...