Надеюсь, вопрос не в двусмысленности.
когда я спрашиваю:
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.
Я надеюсь, что это имеет смысл: ‘{Спасибо!
По умолчанию консоль находится в приготовленный режим (канонический режим, линейный режим, …). Это означает
Обычно это означает, что ваша программа получает доступ к вводу только после окончания строки, т.е. когда войти нажата. Из-за авто-эха эти персонажи уже появляются на экране.
Обе настройки могут быть изменены независимо, однако механизм — к сожалению — специфичный для ОС вызов:
Для окна это 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);
Ты можешь использовать scanf("%c",&character)
в цикле от 1 до 12 и добавить их в предварительно выделенный буфер.
Как и в моих комментариях, я упомянул метод, который я выяснил с помощью _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");
}
Это позволяет вам следить за каждым нажатием клавиши, когда она нажата,
при объединении каждого символа нажимается строка с именем.
Затем в любой программе, в которой вы это используете, вы можете отобразить полное имя в виде единого строкового типа.