Попытка использовать int в getline - PullRequest
4 голосов
/ 01 мая 2011
cout << "How many questions are there going to be on this exam?" << endl;
cout << ">>";
getline(cin, totalquestions);

Этот небольшой фрагмент кода взят из функции в классе, который я создал, и мне нужно, чтобы totalquestions был int, чтобы он мог проходить через цикл for и продолжать задавать общее количество вопросов, которыеЯ спросил.

question q;
for(int i = 0; i < totalquestions; i++)
{
    q.inputdata();
    questions.push_back(q);
}

Где этот фрагмент кода играет?У кого-нибудь есть идея сделать эту работу?

Ответы [ 5 ]

12 голосов
/ 01 мая 2011

Использовать

cin >> totalquestions;

Проверить ошибки тоже

if (!(cin >> totalquestions))
{
    // handle error
}
3 голосов
/ 01 мая 2011

Сделайте это:

int totalquestions;
cout << "How many questions are there going to be on this exam?" << endl;
cout << ">>";
cin >> totalquestions;

Getline предназначен для захвата chars. Это можно сделать с помощью getline(), но cin гораздо проще.

2 голосов
/ 01 мая 2011

getline читает всю строку как строку. Вы все еще будете иметь чтобы преобразовать его в int:

std::string line;
if ( !std::getline( std::cin, line ) ) {
//  Error reading number of questions...
}
std::istringstream tmp( line );
tmp >> totalquestions >> std::ws;
if ( !tmp ) {
//  Error: input not an int...
} else if ( tmp.get() != EOF ) {
//  Error: unexpected garbage at end of line...
}

Обратите внимание, что просто ввод std::cin непосредственно в totalquestions не не работает; это оставит позади '\n' символ в буфере, который будет десинхронизировать все следующий вход. Можно избежать этого, добавив позвоните на std::cin.ignore, но это все равно пропустит ошибку из-за висящего мусора. Если вы делаете линейно-ориентированный ввод, придерживайтесь getline и используйте std::istringstream для любого необходимые преобразования.

1 голос
/ 01 мая 2011

Не использовать getline:

int totalquestions;
cin >> totalquestions;
0 голосов
/ 25 ноября 2015

Один из лучших способов получения int от пользователя: -

#include<iostream>
#include<sstream>

int main(){
    std::stringstream ss;

    ss.clear();
    ss.str("");

    std::string input = "";

    int n;

    while (true){
        if (!getline(cin, input))
            return -1;

        ss.str(input);

        if (ss >> n)
            break;

        std::cout << "Invalid number, please try again" << std::endl;

        ss.clear();
        ss.str("");
        input.clear();
}

Почему это лучше, чем использование cin >> n?

Актуальная статья, объясняющая, почему

Что касается вашего вопроса, используйте приведенный выше код для получения значения int, а затем используйте его в цикле.

...