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

Решение

По умолчанию консоль находится в приготовленный режим (канонический режим, линейный режим, …). Это означает

  1. что драйвер консоли буферизует данные перед тем, как передать их вашему приложению
  2. символы будут автоматически возвращаться обратно в консоль драйвером консоли

Обычно это означает, что ваша программа получает доступ к вводу только после окончания строки, т.е. когда войти нажата. Из-за авто-эха эти персонажи уже появляются на экране.

Обе настройки могут быть изменены независимо, однако механизм — к сожалению — специфичный для ОС вызов:

Для окна это 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);
9

Другие решения

Ты можешь использовать scanf("%c",&character) в цикле от 1 до 12 и добавить их в предварительно выделенный буфер.

0

Как и в моих комментариях, я упомянул метод, который я выяснил с помощью _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");
}

Это позволяет вам следить за каждым нажатием клавиши, когда она нажата,
при объединении каждого символа нажимается строка с именем.

Затем в любой программе, в которой вы это используете, вы можете отобразить полное имя в виде единого строкового типа.

0
По вопросам рекламы [email protected]