我希望这个问题不要模棱两可。

当我问:

int main()
{

string name = {""};

cout << "Please enter a name: " << endl;
getline(cin, name);
//user enters 12 characters stop displaying next literal keypresses.
enter code here
}

我希望能够限制用户可以在屏幕上输入字符的次数。例如,屏幕在长度 12 之后停止显示字符?

如果是这样,执行此类操作的库和命令行是什么?

想要这样,我在 CMD 上绘制了一个 ascii 艺术,当我在 x,y 处计算语句时,输入的任何超过 12 个字符的内容都会绘制在 ascii 艺术上。

我希望这是有道理的:'{谢谢!

最佳答案

默认情况下,控制台处于 cooked mode(规范模式、线路模式……)。这表示

  • 控制台驱动程序在将数据交给您的应用程序之前正在缓冲数据
  • 字符将被控制台驱动程序自动回显到控制台

  • 通常,这意味着您的程序仅在一行结束后(即按下 Enter 键时)才能获取输入。由于自动回声,这些角色已经出现在屏幕上。

    这两个设置都可以独立更改,但是机制是——不幸的是——一个特定于操作系统的调用:

    对于窗口,它是 SetConsoleMode() :
    HANDLE h_stdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode = 0;
    
    // get chars immediately
    GetConsoleMode(hStdin, &mode);
    SetConsoleMode(hStdin, mode & ~ENABLE_LINE_INPUT));
    
    
    // display input echo, set after 12th char.
    GetConsoleMode(hStdin, &mode);
    SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT));
    

    正如你自己所指出的,Windows 仍然提供 conio.h 包括一个非回显 _getch() (现在有下划线)。您可以随时使用它并手动回显字符。 _getch() 简单地将控制台线路模式开/关,回声开/关开关包装成一个函数。

    编辑:这里有一个使用 _getch() 的例子。我有点忙于正确完成它,我避免发布潜在的错误代码。

    在 *nix 下,您很可能想使用 curses/termcap/terminfo。如果您想要更精简的方法,低级例程记录在 termios/tty_ioctl 中:
    #include <sys/types.h>
    #include <termios.h>
    
    struct termios tcattr;
    
    // enable non-canonical mode, get raw chars as they are generated
    tcgetattr(STDIN_FILENO, &tcattr);
    tcattr.c_lflag &= ~ICANON;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
    
    // disable echo
    tcgetattr(STDIN_FILENO, &tcattr);
    tcattr.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
    

    关于c++ - CMD 提示 C++ : Limiting literals entered on screen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32325985/

    10-11 03:33
    查看更多