You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++预显待输入内容实现及图书馆项目密码输入短划线优化问询

问题1:C++中实现输入前先显示后续内容

要实现这个效果,核心是先输出后续内容,再把光标移回输入起始位置,不同操作系统的光标控制方式不同,分两种场景处理:

Windows平台

借助Windows API的SetConsoleCursorPosition函数控制光标位置,步骤如下:

  1. 记录初始光标位置
  2. 输出后续要显示的内容
  3. 将光标移回初始输入位置
  4. 正常接收用户输入

示例代码:

#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个字符,步骤:

  1. 计算后续内容的长度
  2. 输出后续内容
  3. 用ANSI序列将光标移回输入位置
  4. 接收输入

示例代码:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:46:27