Проблемы с функцией cin.getline () в C ++ - PullRequest
0 голосов
/ 07 марта 2020

для короткого теста в моем классе, мы должны были написать код о свиньях, который позволял пользователю вводить информацию о наборе свиней (например, имена свиней, порода, вес, пол и т. Д. c.). Мы должны были создать класс под названием свиньи, который мог бы хранить информацию о свиньях. В самом классе не было ничего плохого, проблема, с которой я столкнулся, заключается в главной функции.

    cout << "Enter the pig gender (\'m\'/\'f\')(if not press \'enter\' for none): ";
    cin.getline(pigGender, 10);
    if(pigGender != "\n")
    {
        while(pigGender != "m" && pigGender != "f")
        {
            cout << "Invalid gender, please enter a valid gender m or f(if not press \'Enter\'): ";
            cin.getline(pigGender, 10);
            if(pigGender != "\n")
            {
                //cout << "if branch, pigGender:" << pigGender; 
                gender = pigGender[0];
            }
            else
            {
                //cout << "else branch, pigGender:" << pigGender;
                gender = ' ';
                break;
            }
        }
        pigs[i].SetPigGender(gender);
    }

В приведенном выше фрагменте кода показано, как я пытаюсь получить пол свиньи из пользователь. Я сделал так, чтобы, если пользователь не знал пол, он мог просто нажать Enter, чтобы двигаться дальше (как я делал с другими функциями, которые работали нормально). Проблема в том, что когда вы нажимаете Enter, строка pigGender, похоже, не принимает символ новой строки. Кроме того, я понимаю, как работает функция getline (принимает новую строку и останавливается), поэтому я верю, что когда вы нажмете клавишу ввода, getline возьмет новую строку и остановится, но здесь она, похоже, не принимает ее вообще. Я также сделал так, чтобы, если пользователь вводит неправильную букву (не m или f), он все равно может нажать Enter, если он не знает. Закомментированные коды - это проверки, которые я реализовал, чтобы точно увидеть, что было в pigGender. Когда я вхожу в charcter, который не является новой строкой, он будет go переходить в ветвь if и отображать мое сообщение об ошибке, однако, когда я нажимаю только enter, он все равно проходит через ветвь if вместо ветви else. Проверки, которые я прокомментировал, показывают мне, в какой ветке я нахожусь, и символ в строке pigGender, и когда я нажимаю ввод для новой строки, кажется, что в строке pigGender ничего нет. Что кажется еще более странным, так это то, что следующий код очень похож на тот, что я делал выше (я на самом деле скопировал и вставил его, и внес некоторые изменения, чтобы сделать тот, что выше), и он отлично работает.

    cout << "Enter the pig weight(if not press \'Enter\'): ";
    cin.getline(weight, 10);
    if(weight != "\n")
    {
        float pigWeight = atof(weight);
        while(pigWeight < 0)
        {
            cout << endl;
            cout << "Invalid weight, please enter a valid weight(if not press \'Enter\'): ";
            cin.getline(weight, 10);
            if(weight != "\n")
            {
                pigWeight = atof(weight);
            }
            else
            {
                pigWeight = 0;
            }
        }
        pigs[i].SetPigWeight(pigWeight);
    }

Есть ли что-то, чего я просто не вижу здесь, потому что я просматривал этот код со вчерашнего дня и пробовал кучу вещей, чтобы исправить это, но не могу. Конечно, я знаю много других способов решения этой проблемы (например, сравнивая размер строки вместо этого), но я начал с этого, и меня действительно беспокоит то, что это не работает, поэтому я просто хочу выяснить это просто так, чтобы я мог знать. Если вы можете помочь мне понять, пожалуйста, ответьте, я действительно хочу выяснить это, спасибо!

...