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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2014, 12:57   #1
Arcasha
 
Регистрация: 28.03.2014
Сообщений: 5
По умолчанию Проверка на корректность ввода

Здравствуйте! Нужна помощь: нужно реализовать проверку на корректность ввода инициалов, к примеру Иванов И.И. то есть, если вместо первой буквы введут цифру или вместо второй точки - запятую, должна быть ошибка, форма должна быть такая(Русская буква.Русская буква.) Помогите с осуществлением. Заранее благодарю!
Arcasha вне форума Ответить с цитированием
Старый 17.10.2014, 13:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мне кажется что проще будет проверку делать после ввода.
Т.е. скажем три цикла: Первый проверяет до пробела фамилию. Втрой имя, третий отчество. Тупо пройтись и проверить не попадает ли символ в пределы от '0 до '9'
Или наоборот попадает ли символ в перделы от 'а' до 'я' или от 'А' до 'Я'.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2014, 15:56   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Можно задействовать регулярные выражения.

Пример:

http://rextester.com/MUWBY39680

Код:
#include <boost/regex.hpp>
#include <iostream>
#include <string>
using namespace std;


bool valid(const string& text, const string& regex_mask)
{
    const  boost::regex my_filter(regex_mask);
    return boost::regex_match(text, my_filter);
}

void Test(const string& text, const string& regex_mask)
{
    if( valid(text, regex_mask) )
        cout<<text<<": success\n";
    else
        cout<<text<<": denied\n";
}

int main()
{
    std::cout << "Hello, world!\n";
   
    //имя сотрудника. Не допускаются цифры, знаки пунктуации, и пробельные символы
    //имя может быть любой длины
    const string name = "[^[:digit:]^[:punct:]^[:space:]]*";
    
    //инициал сотрудника. Не допускаются цифры, знаки пунктуации, и пробельные символы
    //должен быть из одного символа
    const string initial = "[^[:digit:]^[:punct:]^[:space:]]{1}";
    
    //текст должен содержать имя сотрудника, затем обязательно идет пробел
    //затем обязательно идет инициал из 1 буквы, затем обязательно символ точечка и пробел
    //затем обязательно ещё один инициал и точечка
    const string regex_mask = name + " " + initial + "\\. " + initial + "\\.";
    
    const string correctly    = "Invanow I. I." ;
    const string incorrectly1 = "Invanow1 I. I.";
    const string incorrectly2 = "In,vanow I. I.";
    const string incorrectly3 = "Invanow II."   ;
    const string incorrectly4 = "Invanow I. I"  ;
    
    Test(correctly,    regex_mask);
    Test(incorrectly1, regex_mask);
    Test(incorrectly2, regex_mask);
    Test(incorrectly3, regex_mask);
    Test(incorrectly4, regex_mask);
}

Информация по регуляркам:
http://www.cplusplus.com/reference/regex/ECMAScript/
http://www.boost.org/doc/libs/1_55_0...egex/doc/html/

Последний раз редактировалось _Bers; 17.10.2014 в 16:01.
_Bers вне форума Ответить с цитированием
Старый 17.10.2014, 16:00   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Могу показать, как я делаю. Правда не работаю с кириллицей в консоли. Не уверен, что регулярки работают с кириллицей (имею ввиду класс std::regex)

Корректность данных (таких, как: имена, ники, телефоны, email'ы) удобнее всего, на мой взгляд, проверять регулярными выражениями. Тестить их можно онлайн, например, здесь: http://rubular.com

Такое выражение задаёт шаблон для фамилии и инициалов: \b[a-zA-z]+\b [a-zA-Z].[a-zA-Z].

Что он означает можно прочитать внизу здесь: http://rubular.com

Вот пример: http://rubular.com/r/T0dcCY2zbR

В коде на C++11 будет так:

main.cpp
Код:
#include <string>
#include <regex>
#include <iostream>

bool checkFullName( const std::string &fullName );

int main()
{
    while( true ) {
        std::cout << "\nEnter full name (q=quit):\n> ";

        std::string str;
        if ( !std::getline( std::cin, str ) || str == "q" ) {
            break;
        }

        bool isFullName = checkFullName( str );
        if ( !isFullName ) {
            std::cerr << "Error: you wrote incorrect full name. Try again." << std::endl;
        } else {
            std::cout << "Ok!" << std::endl;
        }
    }
    return 0;
}

bool checkFullName( const std::string &fullName )
{
    std::regex expression("(\\b[a-zA-z]+\\b [a-zA-Z].[a-zA-Z].)");
    std::sregex_token_iterator first( fullName.begin(), fullName.end(), expression ); 
    std::sregex_token_iterator last;
    if ( first != last ) {
        return true;
    } else {
        return false;
    }
}
Output
Цитата:
Enter full name (q=quit):
> Ivano5v I.I.
Error: you wrote incorrect full name. Try again.

Enter full name (q=quit):
> Ivanov. I.I.
Error: you wrote incorrect full name. Try again.

Enter full name (q=quit):
> Ivanov I.I.
Ok!

Enter full name (q=quit):
> q
Press any key to continue . . .

Последний раз редактировалось 8Observer8; 17.10.2014 в 16:09.
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка ввода на корректность -=Oleg=- Общие вопросы C/C++ 2 26.11.2013 13:02
Корректность ввода из файла DonVito Общие вопросы C/C++ 0 28.05.2013 17:05
C++.Корректность ввода строки! Skull_psyhothik Помощь студентам 2 01.10.2012 19:40
Корректность ввода на СИ glebast Помощь студентам 4 14.09.2012 22:42
Проверка на корректность строк Ilya_L Microsoft Office Excel 5 22.06.2010 11:23