Нет соответствующей функции для вызова getline (std :: istream &, int &) - PullRequest
2 голосов
/ 07 февраля 2020

Я писал код, операторы задачи которого были введены пользователем и ищет слово «не», присутствующее в нем или нет, если его нет, то он печатает Real Fancy , иначе он печатает регулярно фантазирую , но я получаю сообщение об ошибке в такой простой программе.

Мой код выглядит так:

#include <iostream>
#include <string.h>
using namespace std;

int main () {
    string str2 (" not ");
    string str3 ("not ");
    string str4 ("not");

    int T;
    std::getline(std::cin, T);
    for (int k=0;k<T;k++){
        string str ;


        std::getline(std::cin, str);
        int len = str.size();
        //condition for only not as a sentence
        if ((str.find(str4) != string::npos) && len ==3) {
            cout<<"Real Fancy";
        }        
        // condition to check for not word in middle of a sentence eg. this is not good
        else if ((str.find(str2) != string::npos) ) {
            cout<<"Real Fancy";
        }        
        // condition if the statement ends with the word not 
        else if (str[len-1]=='t' && str[len-2]== 'o' && str[len-3]== 'n' && str[len-4]== ' '){
            cout<<"Real Fancy";
        }        
        // code to check for if statement starts with word not
        else if ((str.find(str3) != string::npos) ) {
            cout<<"Real Fancy";
        }
        else {
            cout<<"regularly fancy";
        }
        cout<<endl;
    }
    return 0;
}

и ошибка, которую я получаю после запуска этого кода:

main. cpp: 11: 30: ошибка: нет соответствующей функции для вызова getline (std :: istream &, int &) '

Ответы [ 5 ]

3 голосов
/ 07 февраля 2020

std::getline имеет две перегрузки:

(1) istream& getline (istream& is, string& str, char delim);
(2) istream& getline (istream& is, string& str);

Вы пытаетесь вызвать его с параметром int, который не будет работать.

Есть два способа решить эту проблему:

Используйте std::stoi для анализа int после чтения в std::string

Считывание из потока непосредственно в int с использованием std::cin >> T. Это не будет рассматривать новые строки специально, хотя и использовать любые пробелы в качестве разделителя между целыми числами. Поэтому, если вы пытаетесь проанализировать ровно один int на строку, первый вариант подойдет вам лучше.

2 голосов
/ 07 февраля 2020

std::getline() функция не для целочисленного типа. Если вы хотите использовать std::getline() для целого числа, вы должны объявить временное значение строкового типа. например в вашем случае

int T;
std::string tmp_s;
std::getline(std::cin, tmp_s);
T = std::stoi(tmp_s);
1 голос
/ 07 февраля 2020

std::getline имеет следующие перегрузки:

istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

, и, как вы можете видеть, ни один из них не получает целое число в качестве второго параметра, поэтому здесь есть возможные решения для вас :

  • , если вы ограничены C ++ 11, используйте std::stoi следующим образом:
std::string line;
std::getline(std::cin, line);
int T = std::stoi(line);
  • Если вы можете использовать C ++ 17, я настоятельно рекомендую использовать std::from_chars следующим образом:
int value = 0;
std::string line;
std::getline(std::cin, line);
const auto result = std::from_chars(str.data(), str.data() + str.size(), value);
if (result.ec == std::errc()) {
    // strings is successfully parsed
}

Почему std::from_chars лучше, чем std::stoi?

Поскольку std::from_chars не генерирует ошибку и дает вам лучшее сообщение об ошибках (что даст вам больше информации о результате конверсии). Кроме того, по некоторым данным, это немного быстрее, чем std::stoi. Подробнее о std::from_chars здесь .

0 голосов
/ 07 февраля 2020

это действительно здорово видеть много положительных ответов, кстати, я хотел бы добавить еще один способ достижения цели:

int T;
cin>>T;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
0 голосов
/ 07 февраля 2020

Согласно http://www.cplusplus.com/reference/string/string/getline/

Вы должны использовать getline в этой форме:

istream& getline (istream&  is, string& str); 
istream& getline (istream&& is, string& str);

Вы делаете это:

int T;
std::getline(std::cin, T);

T является целым числом, и такого вызова не существует.

...