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);

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

Другие вопросы по тегам