Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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

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

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

Цитата:
Сообщение от 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, 19:12   #6
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 29
Репутация: 10
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[PascalABC]Создать программу для определения количества гласных среди 5-и введенных пользователем символов. Определение количества destra1j Помощь студентам 5 15.05.2016 10: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


02:05.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru