Вместо того, чтобы отлаживать данный код, потому что в нем много неправильного, давайте покажем вам несколько простых способов сделать это.
Создание функции, которая получает пол. Это позволяет легко оставаться в цикле, пока у вас не будет правильного ввода. Если вы получаете что-то, что можете использовать, вы возвращаетесь из функции. Если нет, то вы оборачиваетесь и спрашиваете снова.
Для ввода одного символа читайте char
, а не string
, если только у вас нет веских причин считать символ в виде строки.
Попробуйте использовать std::tolower
или std::toupper
для преобразования char
в фиксированный случай, чтобы вам не приходилось тестировать оба случая. Но для чего-то очень простого, подобного этому, я бы использовал оператор switch
и протестировал бы все 4.
Обратите внимание, что я всегда использую полное имя, полное с идентификатором. Это потому, что using namespace standard;
может вызвать некоторые действительно интересные ошибки .
char getGender(std::istream & in) // using a generic input stream so this function can be used
// with any input method
{
while (true) // keep looping until the user gives valid input.
{
char gend; // only need one character, just read one character
if (in >> gend) // read the gender and test to be sure the stream isn't broken
{
throw std::runtime_error("The input stream is broken!");
// throw an exception to force the program to deal with the broken stream or crash
}
switch(gend)
{
case 'm':
case 'M':
// do stuff for male case
return 'm';
case 'f':
case 'F':
// do stuff for female case
return 'f';
default:
cout << "Wrong gender input. Please enter again. Gender (M or F):" << endl;
break;
}
}
}
Нет выхода из этой функции без 'm'
или 'f'
, за исключением исключения, которое требует специальной обработки.
Если все, что вам нужно, это 'm'
или и 'f'
, и вам все равно, какие в настоящее время вы можете немного упростить с помощью функции std::strchr
.
char getGender(std::istream & in) // using a generic input stream so this function can be used
// with any input method
{
while (true) // keep looping until the user gives valid input.
{
char gend; // only need one character, just read one character
if (in >> gend) // read the gender and test to be sure the stream isn't broken
{
throw std::runtime_error("The input stream is broken!");
// throw an exception to force the program to deal with the broken stream or crash
}
if (std::strchr("mMfF", gend) != NULL)
{
return std::tolower(std::static_cast<unsigned char>(gend);
}
else
{
cout << "Wrong gender input. Please enter again. Gender (M or F):" << endl;
}
}
}