c++ - CMD 提示符 C++ : Limiting literals entered on screen

标签 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 处计算语句时,y 任何超过 12 个字符的长输入都会绘制在 ascii 艺术上。

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

最佳答案

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

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

通常,这意味着您的程序只会在一行结束后获取输入,即当按下 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/

相关文章:

c++ - 是否存在轻量级且免安装的数据库系统?

c++ - 如何将运算符作为参数传递

string - 为什么从标准输入读取用户输入时我的字符串不匹配?

java - 在java中将递归帕斯卡三角形居中?

c - 如何通过更改数据类型在不同变量中获取没有空格的输入

c++ - 用c++格式化驱动

c++ - QTimer 根本不准确?

batch-file - 如何使用批处理脚本将未清理的字符串复制到剪贴板

windows - Netsh 设置规则取决于操作系统语言

windows - 如何在 Windows 上设置 PhoneGap