Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Paraponera
9 / 9 / 3
Регистрация: 22.04.2015
Сообщений: 37
Завершенные тесты: 1
#1

Функция getline пропускает ввод строки - C++

13.05.2015, 17:44. Просмотров 1097. Ответов 10
Метки нет (Все метки)

Строка с getline(cin, pc[i].name); пропускает ввод.
Пишу getline(cin, pc[i].name); так, как нужно ввести строку с пробелами.
Подскажите ,что я делаю не так. И если можно объясните.
Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
//----------------------------------------------------------------------------------------------------------------------
struct car
{
    std::string name;
    int year;
};
//----------------------------------------------------------------------------------------------------------------------
int main()
{
    using namespace std;
    int catalog, i, number_car{};
    cout << "How many cars to place in the catalog? ";
    cin >> catalog;
    car *pc = new car [catalog];
    for (i = 0; i < catalog; ++i)
    {
        number_car++;
        cout << "\nCar #" << number_car << endl;
        cout << "Enter the producer: ";
        getline(cin, pc[i].name);
        cout << "Specify year of release: ";
        cin >> pc[i].year;
    }
    while (number_car >= 1)
    {
        cout << "\nHere your collection:\n";
        for (i = 0; i < catalog; ++i)
            cout << pc[i].year << " " << pc[i].name << endl;
        number_car = 0;
    }
    cin.get();
    cin.get();
    delete[] pc;
    return 0;
}
//----------------------------------------------------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2015, 17:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция getline пропускает ввод строки (C++):

Программа пропускает ввод первой строки - C++
здраствуйте. в коде програмы, приведенном ниже, в структуру Track записываются данные, считанные с клавиатуры(функция Track...

Пропускает getline - C++
Доброго времени суток. Проблема с getline в строке 33 - компилятор его просто не видит. Думал, что в потоке оставался \n, но ни cin.get(),...

Компилятор пропускает getline - C++
добрый вечер, пишу лабу для 10 класса по переводу числа из одной СС в другую. По неведомой мне причине компилятор пропускает строчку с...

Копирование строки. При вводе пробела программа пропускает последующий ввод данных - C++
char st, st1; int k, m, i, j; system(&quot;cls&quot;); cout &lt;&lt;&quot;Введите строку&quot;&lt;&lt;endl; cin &gt;&gt;st; cout &lt;&lt;&quot;Введите номер символа,...

Программа пропускает вызов cin.getline() во время выполнения - C++
помогите исправить прогу, не работает cin.getline, просто пропускает ее(( void main() { setlocale(LC_ALL,&quot;russian&quot;); char...

Функция getline(s), вычисляющая длину входной строки s - C++
1. Функция getline(s), вычисляющая длину входной строки s.

10
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
13.05.2015, 17:47 #2
Не вникая в текст. Сразу рекомендую ознакомиться с
Распространенные ошибки
Это относится к
cout << "\nCar #" << number_car << endl;
cout << "Enter the producer: ";
getline(cin, pc[i].name);
1
Paraponera
9 / 9 / 3
Регистрация: 22.04.2015
Сообщений: 37
Завершенные тесты: 1
13.05.2015, 20:36  [ТС] #3
Цитата Сообщение от zss Посмотреть сообщение
Не вникая в текст. Сразу рекомендую ознакомиться с
Распространенные ошибки
Это относится к
Спасибо. Переработанный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
//----------------------------------------------------------------------------------------------------------------------
struct car
{
    std::string name;
    int year;
};
//----------------------------------------------------------------------------------------------------------------------
int main()
{
    using namespace std;
    int catalog, i, number_car{};
    cout << "How many cars to place in the catalog? ";
    (cin >> catalog).get();
    car *pc = new car [catalog];
    for (i = 0; i < catalog; ++i)
    {
        number_car++;
        cout << "\nCar #" << number_car << endl;
        cout << "Enter the producer: ";
        getline(cin, pc[i].name);
        cout << "Specify year of release: ";
        (cin >> pc[i].year).get();
    }
    while (number_car >= 1)
    {
        cout << "\nHere your collection:\n";
        for (i = 0; i < catalog; ++i)
            cout << pc[i].year << " " << pc[i].name << endl;
        number_car = 0;
    }
    cin.get();
    delete[] pc;
    return 0;
}
//----------------------------------------------------------------------------------------------------------------------
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,177
Завершенные тесты: 1
13.05.2015, 20:40 #4
Цитата Сообщение от Paraponera Посмотреть сообщение
(cin >> pc[i].year).get();
Достаточно будет ввести лишний пробел после года и снова пропустит... Уж лучше читать до перевода каретки.
C++
1
while (cin.get() != '\n');
1
Paraponera
9 / 9 / 3
Регистрация: 22.04.2015
Сообщений: 37
Завершенные тесты: 1
13.05.2015, 21:09  [ТС] #5
Цитата Сообщение от FraidZZ Посмотреть сообщение
Достаточно будет ввести лишний пробел после года и снова пропустит... Уж лучше читать до перевода каретки.
C++
1
while (cin.get() != '\n');
Действительно, после пробела снова пропускает.
Переработал код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
//----------------------------------------------------------------------------------------------------------------------
struct car
{
    std::string name;
    int year;
};
//----------------------------------------------------------------------------------------------------------------------
int main()
{
    using namespace std;
    int catalog, i, number_car{};
    cout << "How many cars to place in the catalog? ";
    cin >> catalog;
    car *pc = new car [catalog];
    for (i = 0; i < catalog; ++i)
    {
        number_car++;
        cout << "\nCar #" << number_car << endl;
        cout << "Enter the producer: ";
        while (cin.get() != '\n');
        getline(cin, pc[i].name);
        cout << "Specify year of release: ";
        cin >> pc[i].year;
    }
    while (number_car >= 1)
    {
        cout << "\nHere your collection:\n";
        for (i = 0; i < catalog; ++i)
            cout << pc[i].year << " " << pc[i].name << endl;
        number_car = 0;
    }
    cin.get();
    cin.get();
    delete[] pc;
    return 0;
}
//----------------------------------------------------------------------------------------------------------------------
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
13.05.2015, 21:35 #6
Цитата Сообщение от Paraponera Посмотреть сообщение
Действительно, после пробела снова пропускает.
А если букву ввести вместо числа?
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,177
Завершенные тесты: 1
13.05.2015, 21:41 #7
lss, мдя. В таком случае будет пытаться получить символ перевода каретки несмотря ни на что.

Добавлено через 1 минуту
В таком случае, правильнее проверять валидность потока после ввода и бросать исключение...
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
13.05.2015, 22:18 #8
Цитата Сообщение от FraidZZ Посмотреть сообщение
В таком случае, правильнее проверять валидность потока после ввода и бросать исключение...
Можно просто clear() добавить перед while (cin.get() != '\n').
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,177
Завершенные тесты: 1
13.05.2015, 22:22 #9
lss, зависит от того, какое поведение ожидается от программы после невалидного ввода =)
Можно вообще
C++
1
while (!(cin >> i)) { cin.clear(); while (cin.get() != '\n'); }
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
13.05.2015, 22:26 #10
Цитата Сообщение от FraidZZ Посмотреть сообщение
В таком случае будет пытаться получить символ перевода каретки несмотря ни на что.
Не будет, он же сломан.

Добавлено через 1 минуту
Цитата Сообщение от FraidZZ Посмотреть сообщение
зависит от того, какое поведение ожидается от программы после невалидного ввода
Конечно.
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 242
Регистрация: 06.01.2013
Сообщений: 4,177
Завершенные тесты: 1
13.05.2015, 22:30 #11
Цитата Сообщение от lss Посмотреть сообщение
Не будет, он же сломан.
Пытаться будет сама программа из-за
C++
1
while (cin.get() != '\n');
Несмотря ни на что [на то, что cin сломался]
0
13.05.2015, 22:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 22:30
Привет! Вот еще темы с ответами:

Std::getline() пропускает итерацию в цикле: найти и исправить ошибки в коде - C++
Цикл for принимает на одну строку меньше чем должен. Я так понимаю это getline() воспринимает введенную перед этим переменную &quot;int n&quot; как...

Функция getline считывает несколько строк из файла, игнорируя символ новой строки - C++
Всем доброго дня! В С++ я новичок, сам себе придумываю задачки, просто для тренировки. Столкнулся с непонятным для меня поведением...

Пропускает ввод символа - C++
Начал изучать с++ и в процессе выполнения наткнулся на проблему. В процессе выполнения программа нормально запрашивает и принимает ...

Пропускает ввод данных после for - C++
После заполнения вектора и выхода из цикла for программа завершается . Почему компилятор не переходит к следующему циклу while ? . ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru