Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2018, 19:03   #1
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
Вопрос Максимальное кол-во введенных символов пользователем

Здравствуйте. Возможно ли в С++ задать максимальное допустимое кол-во символов, которые пользователь вводит через cin? Имею ввиду, можно ли сделать к примеру, чтобы лимит был равен 3 символам. Если пользователь пытается ввести больше трех, то в консольном окне они даже не отображаются, остаются только первые три.
Yudin вне форума Ответить с цитированием
Старый 11.01.2018, 20:29   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Если убрать часть о том, чтобы символы не отображались, то можно просто установить ширину ввода, например, с помощью манипулятора std::setw.
А чтобы убрать их отображение, необходимо вручную контролировать консоли. Это уже не входит в функционал cin и даже c++. Придется использовать WinAPI (если речь о windows).
Croessmah вне форума Ответить с цитированием
Старый 12.01.2018, 23:49   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
Здравствуйте. Возможно ли в С++ задать максимальное допустимое кол-во символов, которые пользователь вводит через cin? Имею ввиду, можно ли сделать к примеру, чтобы лимит был равен 3 символам. Если пользователь пытается ввести больше трех, то в консольном окне они даже не отображаются, остаются только первые три.

возможно.
_Bers вне форума Ответить с цитированием
Старый 12.01.2018, 23:54   #4
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
возможно.
исчерпывающий ответ. И как?
Yudin вне форума Ответить с цитированием
Старый 13.01.2018, 13:39   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
исчерпывающий ответ. И как?
под виндовс:

Код:
#include <iostream>
#include <cassert>
#include <locale>
#include <limits>
#include <string>
#include <sstream>

#include <conio.h>


void clear_input() noexcept
{
    std::cin.clear(),
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    assert(std::cin);
}
 
template<typename Data, class Checker> 
void input(const char* msg, const char* help, const Checker& checker, Data& dst, const bool check = true)
{
    for (;;)
    {
        assert(std::cout);
        std::cout << msg; 
        std::string accumulate;
        for (;;)
        {
            auto code = _getch();
            if (code == 13 || code == 27)
                break;

            if (code == 224)
                _getch(),
                code = 8;
                
            if(code == 8)
            {
                std::cout << "\b \b";
                if(!accumulate.empty())
                    accumulate.pop_back();
            }
            else
            {
                if(accumulate.length()==6)
                    continue;

                const auto ch = static_cast<char>(code);
                accumulate += ch;
                std::cout << "*";
            }
        }

        std::stringstream ss(accumulate);
        assert(ss);
        ss >> dst;

        const bool invalid = check && !ss;
        if (invalid || !checker(dst))
            std::cout << "\nerror: " << help;
        else
            break;
    }
}

template<typename Data> 
void input(const char* msg, const char* help, Data& dst, const bool check = true)
{ 
    const auto lambda = [](const Data&) { return true; };
    input(msg, help, lambda, dst, check);
}


int main(int argc, char* argv[])
{
    (void)argc;
    (void)argv;
    ::setlocale(LC_ALL, "");

    // допустим мы ожидаемы пароль:
    const char* expected_password = "123";

    // тогда валидатор введенного пароля имеет вид:
    const auto checker 
        = [expected_password](const std::string& value) 
        { return value == expected_password; };

    // в случае успеха 
    // результат ввода окажется в этой переменной:
    std::string result;

    input("\nenter password: ",
          "incorrect password!",
          checker,
          result
    );

    std::cout << "\naccess is allowed\n";
}
в линуксах нужно искать свой аналог conio.h
_Bers вне форума Ответить с цитированием
Старый 14.01.2018, 18:12   #6
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

спасибо... как все сложно
Yudin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[PascalABC]Создать программу для определения количества гласных среди 5-и введенных пользователем символов. Определение количества destra1j Помощь студентам 5 15.05.2016 09:29
Сортировка чисел, введенных пользователем andrew m Помощь студентам 2 15.06.2014 00:47
По C. Сумма введенных пользователем чисел HenryO Общие вопросы C/C++ 6 31.05.2013 14:56
Деление двух чисел, введенных пользователем с клавиатуры Шизофрения Общие вопросы C/C++ 4 02.12.2012 21:58
Максимальное кол-во одинаковых символов MAKEDON Общие вопросы C/C++ 1 11.04.2009 16:23