«Не все пути управления возвращают значение» / «элемент управления может достигать конца не пустой функции» при проверке с помощью цикла while? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь проверить входные данные, которые не являются целыми числами 1, 2 или 3. Я использую цикл do / while, но он не работает и просто повторяется. Что не так?

#include <iostream>
#include <string>

using namespace std;

string decisionThing(int);


int main()
{
    int response;
    cout << "Enter the section you are in in\n";
    cin >> response;

    do
    {
        cout << "Are you in section 1, 2, or 3?";
        cin >> response;


    } while (response != 1 || response != 2 || response != 3);

    cout << decisionThing(response) << "\n";

}

string decisionThing(int response)
{
    string date;

    switch (response)
    {
        case 1:
            date = "The test will be held on the 5th.\n";
            return date;
            break;
        case 2:
            date = "The test will be held on the 6th.\n";
            return date;
            break;
        case 3:
            date = "The test will be held on the 9th.\n";
            return date;
            break;
    }
}


Предполагается, что цикл do / while имеет значение true (пользователь вводит некоторые данные, например 155 или "zebras").

1 Ответ

1 голос
/ 07 мая 2019

Проблема в том, что ваш цикл while всегда возвращает значение true. Вы используете ||, когда вы должны использовать &&. Любой ввод: not 1 или not 2 или not 3.

Измените свой код на это, и это решит проблему.

do {
    cout << "Are you in section 1, 2, or 3?";
    cin >> response;
} while (response != 1 && response != 2 && response != 3);

Что касается ошибки, которую вы получаете, возможно, ваш decisionThing не получит в реальной жизни число, которое не 1, 2 или 3, но компилятор не знает тот. Если этот метод получает число, которое не удовлетворяет ни одному из этих случаев, что должно произойти? это не определено. Для этого у нас есть путь для этого кода, чтобы он не возвращал ничего в функции, предназначенной для возврата строки. Вы можете вернуть пустую строку или сгенерировать исключение или обработать случай default следующим образом:

string decisionThing(int response)
{
    string date;

    switch (response)
    {
        case 1:
            date = "The test will be held on the 5th.\n";
            return date;
        case 2:
            date = "The test will be held on the 6th.\n";
            return date;
        case 3:
            date = "The test will be held on the 9th.\n";
            return date;
        default:
            date = "Wow, this is really unexpected, I guess nothing?\n";
            return date;
    }
}

Кстати, вам не нужны break s, когда у вас есть return. Функция немедленно вернется, поэтому все, что после этого просто не будет выполнено.

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