CMD Prompt C++: ограничение литералов вводится на экране
Надеюсь, вопрос не в двусмысленности.
когда я спрашиваю:
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?
Если это так, что будет библиотека и командная строка для выполнения чего-то вроде этого?
Желая сделать это, у меня есть рисунок ascii на CMD, и когда я ставлю выражение в точке x,y что-либо более чем из 12 символов в длину рисует над ascii art.
Я надеюсь, что это имеет смысл:'{Спасибо!
3 ответа
По умолчанию консоль находится в режиме готовки (канонический режим, линейный режим, ...). Это означает
- что драйвер консоли буферизует данные перед тем, как передать их вашему приложению
- символы будут автоматически возвращаться обратно в консоль драйвером консоли
Обычно это означает, что ваша программа получает доступ только после окончания строки, то есть когда нажата клавиша ввода. Из-за авто-эха эти персонажи уже появляются на экране.
Обе настройки могут быть изменены независимо, однако механизм - к сожалению - специфичный для ОС вызов:
Для окна это 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);
Как и в моих комментариях, я упомянул метод, который я выяснил с помощью _getch(); и отображение каждого символа вручную.
упрощенная версия:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
string name = "";
int main()
{
char temp;
cout << "Enter a string: ";
for (int i = 0; i < 12; i++) { //Replace 12 with character limit you want
temp = _getch();
name += temp;
cout << temp;
}
system("PAUSE");
}
Это позволяет вам отслеживать каждое нажатие клавиши при ее нажатии, объединяя каждый нажатый символ в строку с именем.
Затем в любой программе, в которой вы это используете, вы можете отобразить полное имя в виде единого строкового типа.
Ты можешь использовать scanf("%c",&character)
в цикле от 1 до 12 и добавить их в предварительно выделенный буфер.