C++预显待输入内容实现及图书馆项目密码输入短划线优化问询
问题1:C++中实现输入前先显示后续内容
要实现这个效果,核心是先输出后续内容,再把光标移回输入起始位置,不同操作系统的光标控制方式不同,分两种场景处理:
Windows平台
借助Windows API的SetConsoleCursorPosition函数控制光标位置,步骤如下:
- 记录初始光标位置
- 输出后续要显示的内容
- 将光标移回初始输入位置
- 正常接收用户输入
示例代码:
#include <iostream> #include <windows.h> int main() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO cursorInfo; GetConsoleScreenBufferInfo(hConsole, &cursorInfo); COORD originalPos = cursorInfo.dwCursorPosition; // 记录初始光标位置 // 先输出后续提示内容 std::cout << " (输入完成后按回车确认)"; // 把光标移回输入起始位置 SetConsoleCursorPosition(hConsole, originalPos); // 接收用户输入 std::string input; std::cin >> input; std::cout << "\n你输入的内容是:" << input << std::endl; return 0; }
Linux/macOS平台
用ANSI转义序列控制光标,\033[nD可让光标向左移动n个字符,步骤:
- 计算后续内容的长度
- 输出后续内容
- 用ANSI序列将光标移回输入位置
- 接收输入
示例代码:
#include <iostream> #include <string> int main() { std::string suffix = " (输入完成后按回车确认)"; std::cout << suffix; // 光标向左移动对应长度,回到输入起始位置 std::cout << "\033[" << suffix.size() << "D"; std::string input; std::cin >> input; std::cout << "\n你输入的内容是:" << input << std::endl; return 0; }
问题2:密码输入时一次性显示所有短划线
核心思路是先输出对应长度的短划线,再将光标移到第一个短划线位置,接收输入时覆盖短划线(或隐藏输入但保持短划线显示),以下是固定密码长度的实现示例:
Windows平台示例
#include <iostream> #include <windows.h> #include <conio.h> // 用于无回显输入的_getch() int main() { std::string username; std::cout << "请输入用户名:"; std::cin >> username; std::cin.ignore(); // 清除输入缓冲区的换行符 const int PWD_LEN = 6; std::cout << "\n请输入密码:"; // 一次性输出所有短划线 for (int i = 0; i < PWD_LEN; ++i) { std::cout << "-"; } // 把光标移到第一个短划线的位置 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO cursorInfo; GetConsoleScreenBufferInfo(hConsole, &cursorInfo); COORD pwdStartPos; pwdStartPos.X = cursorInfo.dwCursorPosition.X - PWD_LEN; pwdStartPos.Y = cursorInfo.dwCursorPosition.Y; SetConsoleCursorPosition(hConsole, pwdStartPos); // 无回显接收密码,并用*替换短划线 std::string password; for (int i = 0; i < PWD_LEN; ++i) { char ch = _getch(); password += ch; std::cout << "*"; } std::cout << "\n登录成功!用户名:" << username << std::endl; return 0; }
Linux/macOS平台示例
#include <iostream> #include <string> #include <termios.h> #include <unistd.h> // 自定义无回显输入函数 char getch() { char buf = 0; struct termios old = {0}; if (tcgetattr(0, &old) < 0) perror("tcsetattr()"); old.c_lflag &= ~ICANON; old.c_lflag &= ~ECHO; old.c_cc[VMIN] = 1; old.c_cc[VTIME] = 0; if (tcsetattr(0, TCSANOW, &old) < 0) perror("tcsetattr ICANON"); if (read(0, &buf, 1) < 0) perror("read()"); old.c_lflag |= ICANON; old.c_lflag |= ECHO; if (tcsetattr(0, TCSADRAIN, &old) < 0) perror("tcsetattr ~ICANON"); return buf; } int main() { std::string username; std::cout << "请输入用户名:"; std::cin >> username; std::cin.ignore(); const int PWD_LEN = 6; std::cout << "\n请输入密码:"; // 一次性输出所有短划线 for (int i = 0; i < PWD_LEN; ++i) { std::cout << "-"; } // 光标向左移动对应长度,回到第一个短划线位置 std::cout << "\033[" << PWD_LEN << "D"; // 无回显接收密码,并用*替换短划线 std::string password; for (int i = 0; i < PWD_LEN; ++i) { char ch = getch(); password += ch; std::cout << "*"; } std::cout << "\n登录成功!用户名:" << username << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Abdulaxad
相关产品推荐
相关产品推荐

