Как исправить «ни один экземпляр перегруженной функции «getline» не соответствует списку аргументов» при использовании getline с int

#c

#c

Вопрос:

В настоящее время я работаю над назначением и пытаюсь использовать обработку ошибок try catch для проверки того, что ввод пользователя является допустимым int.

В настоящее время у меня есть это:

 int inputValidation() {
    int e = 0;
    std::string es;
    bool check = false;
    do {
        try {
            if (!getline(std::cin, e)) {
                throw stringInput;
            }
            else {
                check = true;
            }
        }
        catch (std::exceptionamp; er) {
            std::cout << "Error! " << er.what() << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
        }
    } while (!check);
    return e;
}
  

моя проблема связана с if ((getline(std::cin, e))){} частью. Я также пытался использовать std::cin.getline(e, 256)

При вызове функции я использую этот цикл:

 do {
        std::cout << "Please select a month: ";
        selectedMonth = inputValidation();
    } while (selectedMonth < 1 || selectedMonth >(12 - actualMonth));

  

Это просто гарантирует, что они могут вводить только месяц с текущего месяца до декабря.

Я знаю, что могу использовать es вместо e , однако это противоречит цели проверки ошибок. Моя единственная идея, вытекающая из этого, — проверить преобразование.

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

Комментарии:

1. Вы исправляете это, используя правильные параметры, getline всегда принимает строку , а не int.

2. Что не так с std::cin >> e; ?

3. @Borgleader Спасибо 🙂 Есть ли способ использовать этот ввод перед инструкцией if, а затем проверить преобразование? Еще раз спасибо

4. @mch Я изо всех сил пытался очистить буфер и обнаружил, что цикл никогда не прервется, несмотря на то, что входные данные действительны :/

5. @mch Я думаю, что это была проблема с моим циклом — мой плохой

Ответ №1:

если std::cin >> e это не подходит, вы могли бы использовать istringstream :

 std::string asText;

std::getline(cin,asText);

std::istringstream iss (asText);

if (iss >> e)
  

Комментарии:

1. Спасибо за сообщение, Джаспер! Я буквально только что исправил это, а затем увидел ваш ответ :/

Ответ №2:

Первая версия

Мне удалось исправить это, изменив его на:

 int inputValidation(std::string message) {
    int e = NULL;
    std::string es;
    bool check = false;
    do {
        try {
            std::cout << message;
            getline(std::cin, es);
            if (!atoi(es.c_str())) {
                throw stringInput;

            }
            else {
                e = atoi(es.c_str());
                check = true;
            }
        }
        catch (std::exceptionamp; er) {
            std::cout << "Error! " << er.what() << std::endl;
        }
    } while (!check);
    return e;
}
//In another function -->
    do {
        selectedMonth = inputValidation("Please select a month: ");
    } while (selectedMonth < 1 || selectedMonth >(12 - actualMonth));

  

Рабочая версия

Начиная с комментариев, я изменил это.

(Единственное отличие в том, что эта версия не включает исключение)

 bool checkInput(int amp;input, std::string message) {
    try {
        std::cin >> input;
        if (!std::cin.fail()) {
            return true;
        }
        else {
            throw(message);
        }
    }
    catch (std::string e) {
        std::cout << "Invalid input!" << std::endl;
        std::cout << e << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
        return false;
    }
}

//Elsewhere -->
std::cout << "Please input the lowest number you would like to check" << std::endl;
while (!checkInput(lowestNumber, "Please input the lowest number you would like to check"));

  

Комментарии:

1. Это не сработает. atoi() возвращает преобразованный int, а не bool, указывающий на успех. Это будет указывать на сбой, только если проанализированное значение int равно 0. Чтение строки, не подлежащей анализу, приводит к неопределенному поведению. Используйте istringstream или strtol. cplusplus.com/reference/cstdlib/atoi

2. @JasperKent Я понимаю, что вы имеете в виду.. Однако по какой-то причине у меня это работает, и назначение должно быть выполнено завтра. Я не хочу ничего менять, если не знаю, что я опережаю время tbh. Я не пытаюсь звучать здесь как a * *, просто у меня нехватка времени. Я не буду проверять это после отправки, потому что я пытаюсь улучшить работу с C . Спасибо за ваш ответ 🙂

3. Может показаться, что это работает, но поверьте мне — это не так.

4. Хорошо, я изменю его на вашу версию — спасибо за помощь 🙂

5. Я просто изменил его, и теперь оператор if выполняется каждый раз, несмотря на получение допустимого ввода. std::string asText; getline(std::cin, asText); std::istringstream iss(asText); if (!iss >> e) { throw stringInput; }