Проверка ввода строки и даты в c ++? - PullRequest
0 голосов
/ 07 ноября 2010

Я только начал C ++ сегодня. Я делаю простую программу регистрации. Я хочу подтвердить ввод. Я застрял при проверке полного имени и даты рождения. Вот мои требования:

  • ФИО: я просто хочу проверить, пусто ли оно и нет ли пунктуации
  • date_birth: я знаю, что это сложно. Но если бы я мог проверить правильность ввода, например: месяц (1-12), дата (1-30) и год (не более текущего года) должно быть достаточно.

Есть ли быстрый способ сделать это?

EDIT:

Я попытался проверить строку в гугле, я все еще получаю много ошибок. Вот мой текущий код:

string fullname;
do{
    cout << endl << "Please enter your fullname";
    cin >> fullname;
} while(!ispunct(fullname));

Мое сообщение об ошибке:

XXXX: no matching function for call to `ispunct(std::string&)' 

Я уже включил библиотеку, это правильный способ проверки ввода строки. Как вы обычно делаете проверку?

РЕДАКТИРОВАТЬ 2:

bool valid;
string fullname;
do{
    valid = true;
    cout << endl << "Please enter your fullname";
    cin >> fullname;
    string::iterator it;

      for ( it=fullname.begin() ; it < fullname.end(); it++ )
          if(ispunct(*it)){
              valid = false;
          }
} while(!ispunct(fullname));

Странно, я ввел: "!!!", это все еще мимоходом. Что-то не так в моем коде?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Хорошо, я постараюсь направить вас в правильном направлении.Во-первых, чтобы проверить строку, вам нужно будет перебирать ее символ за символом.Вы можете сделать это, используя итераторы и цикл for.У класса string есть метод begin() и end(), который вы можете использовать для циклического перемещения по всей строке и проверки каждого символа.

После того, как вы зациклились над строкой, все, что вам нужно сделать, этонаписать код для проверки его на основе ваших требований.Чтобы убедиться в отсутствии знаков препинания, вы можете использовать функцию std::ispunct, которая сообщит вам, является ли символ знаком препинания.Если вы найдете знаки препинания, просто сочтите это ошибкой.

Ваше первое требование, проверка наличия пустой строки, тривиально.У класса string есть метод empty(), который возвращает true, если строка пуста.

Проверка дня рождения более сложна.Это то, для чего были созданы регулярные выражения.К сожалению, C ++ не имеет встроенной поддержки регулярных выражений (по крайней мере, до следующей версии стандарта).Если вам интересно, Boost имеет хорошую библиотеку регулярных выражений.

В противном случае вам придется перебрать строку и проверить каждый символ.Убедитесь, что строка начинается с символов, которые образуют слово, соответствующее названию месяца, затем убедитесь, что после этого ставится скобка и т. Д. Вам нужно будет решить, как обрабатывать пробелы между символами.Это будет сложно, но это хорошее практическое упражнение для знакомства с C ++.

0 голосов
/ 07 ноября 2010

Решение по второму требованию может быть тривиальным, если вы выберете другой тип данных для представления даты рождения. Ограничения, которые вы упомянули здесь, все числовые (1 <= день <= 31, 1 <= месяц <= 12, 1900 <= год <= 2010), а дата рождения в основном представляет собой набор из трех чисел, поэтому рассмотрите возможность использования типа структуры для birth_date переменная, что-то вроде этого: </p>

struct Date{
  unsigned int day;
  unsigned int month;
  unsigned int year;
};

Date birth_date = {3, 12, 1983};

Когда вы передаете birth_date функции, которая выполняет проверку, вам просто нужно сравнить элементы структуры с ограничениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...