Странный казус в работе getline()

110
03 апреля 2021, 21:20
Написал вот такой код:
#include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        string figure;
        int N;
        cin >> N;
        int count = 0;
        for(int i = 0; i < N; i++)
        {
            getline(cin, figure);
            if(figure[0] == 'T') count+= 4;
            if(figure[0] == 'I') count += 20;
            if(figure[0] == 'D') count += 12;
            if(figure[0] == 'O') count += 8;
            if(figure[0] == 'C') count += 6;
        }
        cout << count;
    }

При i = 0 getline не работает, ввод запрашивает на 1 раз меньше чем требуется. В чём проблема работы getline() ?

Answer 1

После

cin >> N;

в буфере ввода остаются <CR><LF> которые считываются первым вызовом

getline(cin, figure);

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

cin >> N;
cin.ignore();
Answer 2

Ну а зачем считывать строку, если вам нужен только ее первый символ? Лучше считывать только один символ, а всю остальную строку инорировать. Вот аналогичный код:

char c;
int N, count = 0;
cin >> N;
for (int i = 0; i < N; i++)
{
    cin >> c;       
    switch (c)
    {
    case 'T':  count += 4; break;
    case 'I':  count += 20; break;
    case 'D':  count += 12; break;
    case 'O':  count += 8; break;
    case 'C':  count += 6; break;       
    }   
    // игнорируем всю остальную строку
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 
}
cout << count;
READ ALSO
Логические операции С++

Логические операции С++

Недавно начал изучать С++Выполняю упражнение на перевод температур по шкалам

77
Интерактивное SVG колесо

Интерактивное SVG колесо

Есть вот такое колесо:

145
Ошибка ASP.Net Core

Ошибка ASP.Net Core

Всем привет, возникла ошибкаНа сколько я понимаю возникает исключение при попытке доступа к члену типа, значение которого равно null

128
WInForms. Назначить функцию onClick форме

WInForms. Назначить функцию onClick форме

Если вы напишите itemKey

129