上午有朋友让我帮忙实现一个功能:即在终端命令行中实现用户名密码登录。
这个小小的功能涉及了不少的知识点。
1)网上查了一些资料,conio.h这个库里有个getch函数,可以实现关闭输入缓冲区,直接从控制台读取输入字符。但我用的是mac,无法使用conio.h这个头文件。
2)mac端通过调用终端指令 system("stty -icanon") 也可以关闭输入缓冲区。
3)通过getchar()这个方法判断输入字符,直接将字符替换为'*'
这逻辑说起来简单,但对初学者来说实现起来可没那么容易. 这段代码我整整调试了一个多小时.
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main(int argc, const char *argv[]){
string pwd = "123456";//这是用来验证用户输入的密码,即正确的密码。
char upwd[20];//用来存储用户输入的每一个字符。
string username;
cout << "请输入用户名: ";
cin >> username;
cout << "请输入密码:";
int i = 0;
char c;
const char *ptr = upwd; //ptr指向upwd,这是为了将字符数组转换为string类型,方便验证输入是否正确
int k = 0;
while(((c=getchar())!=EOF) && i<20){
if(c=='\n'){ //用户一共会输入2次回车,第一次是用户名之后,第二次是密码之后.只判断第2次的回车.
++k;
cout << '\b';//这行代码是我调试半天后加上去的,用户输入用户名后有个回车也读进来了,把回车符删掉。
if(k>1){
string uupw(ptr);
if(uupw == pwd){
cout << "系统登录成功!"<<endl;
} else {
cout << "用户名密码错误,系统退出。"<<endl;
}
break;
}
} else {
//坑吃半天,就为了下面这4行代码,将用户的输入保存在upwd中,输入一个删掉一个,其中'\b'是回退符.
upwd[i] = c;
cout << '\b';
cout << '*';
i++;
}
}
return 0;
}