记一个密码输入demo
#ifdef _WIN32 #include <conio.h> #include <windows.h> #else #include <termios.h> #endif #include <iostream> #include <ctype.h> #include <string> #include <errno.h> #include <cstring> #define PWD_MAX_LEN (64) #define PWD_MIN_LEN (8) bool IsSpeChar(char c) { std::string spechars = "'-!\"#$%&()*,./:;?@[]^_`{|}~+<=>"; size_t pos = spechars.find(c); if (std::string::npos != pos) { return true; } return false; } int GetChar(char& chr) { #ifdef _WIN32 while(_kbhit() == 0) { Sleep(100); } chr = _getch(); #else struct termios org_opts, new_opts; int r = tcgetattr(STDIN_FILENO, &org_opts); if (-1 == r) { return -errno; } memcpy(&new_opts, &org_opts, sizeof(new_opts)); new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL); new_opts.c_cc[VMIN] = 1; r = tcsetattr(STDIN_FILENO, TCSANOW, &new_opts); if (-1 == r) { return -errno; } chr = getchar(); r = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts); if (-1 == r) { return -errno; } #endif return 0; } int Enter(std::string& pwd) { int flags[4] = {0}; // upper, lower, digit, special while(true) { char c; int r = GetChar(c); if(r < 0) { return r; } #ifdef _WIN32 if (0 == c) { return -1; } if (13 == c) { break; } #else if (c == '\n') { break; } #endif if (pwd.size() > PWD_MAX_LEN) { return -1; } if (isupper(c)) { flags[0] = 1; } else if (islower(c)) { flags[1] = 1; } else if (isdigit(c)) { flags[2] = 1; } else if (IsSpeChar(c)) { flags[3] = 1; } #ifdef _WIN32 else if (8 == c) #else else if (127 == c) // delete #endif { if (!pwd.empty()) { pwd.erase(pwd.end() - 1); putchar('\b'); putchar(' '); putchar('\b'); } continue; } else { return -1; } pwd += c; putchar('*'); } if (pwd.size() < PWD_MIN_LEN) { return -1; } for (size_t i = 0; i < 4; ++i) { if (0 == flags[i]) { return -1; } } return 0; } int main() { std::string pwd; std::cout << "Enter password:"; Enter(pwd); std::cout << "\n" << pwd << std::endl; return 0; }
执行示例:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2021-02-01 OS总结(三):非连续内存分配