CMD Prompt C ++:限制在屏幕上输入的文字

时间:2015-09-01 07:32:46

标签: c++ cmd user-input limiting

我希望问题不是含糊不清。

当我问:

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处声明该声明时,任何超过12个字符长度的东西都会超过ascii艺术。

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

3 个答案:

答案 0 :(得分:9)

默认情况下,控制台处于cooked mode(规范模式,线路模式......)。这意味着

  1. 控制台驱动程序在将数据交给您的应用程序之前缓冲数据
  2. 字符将由控制台驱动程序自动回显到控制台
  3. 通常情况下,这意味着您的程序只有在一行结束后才会获得输入,即按下 enter 时。由于自动回声,这些角色已经在屏幕上。

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

    对于Window 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);
    

答案 1 :(得分:0)

您可以在1到12的循环上使用scanf("%c",&character)并将它们附加到预先分配的缓冲区。

答案 2 :(得分:0)

在我的评论中,我提到了一个我用_getch()计算出来的方法;和 手动显示每个字符。

简化版:

write()

这可以让你按下每个按键, 同时将每个字符连接到一个名为name的字符串。

然后,在您使用此程序的任何程序中,您可以将全名显示为单个字符串类型。