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;
}
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++)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。