Есть ли способ принять первую букву некоторого ввода и проверить, находится ли он в определенном списке? - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь взять пользовательский ввод и проверить, находится ли он в наборе символов.если это так, то он должен вывести некоторый код

Я прошел несколько кодов ошибок слева или справа, но теперь я не могу заставить его распознавать набор инициалов.

    string gend = ""; //input
string Gend = gend.substr(0, 1); //accepts first character of input
string initial = 'm', 'M','f', 'F';

    cout << "Gender (M or F):" << endl;

cin >> gend;

while (Gend != initial){
    cout << "Wrong gender input. Please enter again. Gender (M or F):" << endl;
    cin >> gend;
    if (Gend == initial ) {
        (SOME CODE);

Использование строки устранило коды ошибок, которые я получал.то есть C2227 и C2228

1 Ответ

1 голос
/ 19 июня 2019

Вместо того, чтобы отлаживать данный код, потому что в нем много неправильного, давайте покажем вам несколько простых способов сделать это.

Создание функции, которая получает пол. Это позволяет легко оставаться в цикле, пока у вас не будет правильного ввода. Если вы получаете что-то, что можете использовать, вы возвращаетесь из функции. Если нет, то вы оборачиваетесь и спрашиваете снова.

Для ввода одного символа читайте 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...