Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
proninyaroslav
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 40
#1

Создать динамическую струтуру-массив с типом string и int - C++

31.07.2014, 11:21. Просмотров 367. Ответов 9
Метки нет (Все метки)

Здравствуйте. Учу C++ по книге Прата и делаю его задачи. И тут попалась вот такая задача: создать динамическую струтуру-массив с типом стринг и int. Но дело в том, что когда я с помощью getline() присваиваю значение структуре, он не даёт даже ввести строку и сразу переходит к вводу значения int. То есть вывод получается таким:
Кликните здесь для просмотра всего текста
Сколько автомобилей поместить в каталог? 2
Автомобиль #1

Введите производителя: Укажите год выпуска: 1952
Автомобиль #2

Введите производителя: Укажите год выпуска: 1951
Ваша коллекция:

1952
1951


Вот сам код:
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
#include <iostream>
#include <string>
 
using namespace std;
 
struct car
{
    string name;
    int age;
};
 
int main()
{
    int number;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> number;
    int j = number;
    car *cr = new car [number];
 
    for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
        cout << "Введите производителя: ";
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
    }
    cout << "Ваша коллекция:\n\n";
    for (int i  = 0; i < number; i++)
        cout << cr[i].age << " " << cr[i].name << endl;
    delete [] cr;
}
Пробовал в Xcode, Qt, g++. Результат один и тот же. Ошибок компилятора нет.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 11:21     Создать динамическую струтуру-массив с типом string и int
Посмотрите здесь:

Создать класс String – строку, используя динамическую память - C++
Создать класс String – строку, используя динамическую память. Определить операторы &quot;+&quot; –сложение строк, &quot;=&quot; и &quot;+=&quot; – присваивания, как...

Создать массив размера n+1, не используя динамическую память - C++
Часто встречающийся вопрос,но я не могу найти на него ответ,потому что не могу коротко сформулировать. Вот считываю из файла число n.Мне...

Считывание из файла в массив string и int - C++
Не могу вставить позицию разделителя после определения числовой переменной. Вылетает с ошибкой abort() has been called при вставке кода...

Не получается массив int из строки string - C++
старая песня беру файл input.txt? в нем: 5 0 3 5 2 3 делаю fstream f(&quot;../input.txt&quot;);

Конвертация переменной типа string в массив int - C++
Добрый день. Есть строка string выглядит следующим образом: string str = &quot;01 07 45 0F 12 00 02 09 10 BA 00 34 33 30 35 32 31 31 33&quot;; ...

Создать массив из 5 элементов с типом заданной структуры - C++
Доброго времени суток. Я в замешательстве! Мне нужно получить/записать данные из/в структуры(у) 5 записи, это не сложно ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Firework
63 / 87 / 23
Регистрация: 01.04.2013
Сообщений: 593
31.07.2014, 11:28     Создать динамическую струтуру-массив с типом string и int #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    int number;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> number;
    int j = number;
    car *cr = new car [number];
 
    for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
        cout << "Введите производителя: ";
        cin.sync();
        cin.clear();
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
    }
    cout << "Ваша коллекция:\n\n";
    for (int i  = 0; i < number; i++)
        cout << cr[i].age << " " << cr[i].name << endl;
    delete [] cr;
}
proninyaroslav
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 40
31.07.2014, 11:36  [ТС]     Создать динамическую струтуру-массив с типом string и int #3
Не помогло. Не понимаю в чём причина.

Добавлено через 3 минуты
Факт в том, что если просто добавить в этот цикл сосвем другую стринг переменную, которая вообще не относится к структуре, происходит тоже самое (!). Или если вынести getline(cin, cr[i].name); за пределы цикла то тоже самое.
Firework
63 / 87 / 23
Регистрация: 01.04.2013
Сообщений: 593
31.07.2014, 11:39     Создать динамическую струтуру-массив с типом string и int #4
Как это не помогло? У меня всё работает как надо (компилятор MSVS 2010)
proninyaroslav
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 40
31.07.2014, 11:47  [ТС]     Создать динамическую струтуру-массив с типом string и int #5
Мда, сколько чудес приносит нам C++. Просто добавил после cout << "Автомобиль #" << number - --j << endl << endl; стринг-переменную (самое главное она не относится к структуре) и getline(). После этого гетлайны, идущие после неё, стали записывать в структуру значения. Я не понимаю как это работает. Просто хотел проверить, пишет ли он вообще в другие стринг-переменные в самом цикле. Может подскажете, почему это помогло?

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
#include <iostream>
#include <string>
 
using namespace std;
 
struct car
{
    string name;
    int age;
};
 
int main()
{
    int number;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> number;
    int j = number;
    car *cr = new car [number];
 
    for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
        //решение проблемы
    string h;
    getline(cin, h);
        cout << "Введите производителя: ";
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
    }
    cout << "Ваша коллекция:\n\n";
    for (int i  = 0; i < number; i++)
        cout << cr[i].age << " " << cr[i].name << endl;
    delete [] cr;
}
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
31.07.2014, 11:53     Создать динамическую струтуру-массив с типом string и int #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Весь сыр-бор из-за следующего
Цитата Сообщение от Firework Посмотреть сообщение
cin >> cr[i].age;
После этого чтения указатель входного потока cin стоит на символе конца строки ('\n')
Соответственно в цикле следующая операция чтения строки getline(cin, cr[i].name);
воспринимает этот символ за целую (пустую) строку.
Я этот нюанс решаю простым дополнительным чтением символа
C++
1
2
сin >> cr[i].age;
cin.get();
proninyaroslav
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 40
31.07.2014, 11:57  [ТС]     Создать динамическую струтуру-массив с типом string и int #7
Усовершенствовал код, просто добавив cin.get() вместо стринга и getline(). Получилось так:
C++
1
2
3
4
5
6
7
8
for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
    cin.get();
        cout << "Введите производителя: ";
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
Мне кажется, что проблема появляется, когда ввожу int значение перел циклом, которое потом определяет количество элементов в масиве. Видимо он добавляет конец строки во входную очередь и getline() завершается.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
31.07.2014, 12:10     Создать динамическую струтуру-массив с типом string и int #8
Не туда вставили. Потеряете первую букву у первого производителя.
C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
        cout << "Введите производителя: ";
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
        cin.get();
}
Кстати, это можно написать по пижонски
(cin >> cr[i].age).get();
proninyaroslav
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 40
31.07.2014, 12:21  [ТС]     Создать динамическую струтуру-массив с типом string и int #9
zss, вообще то не потерял). Если внимательно посмотрите, то выше цикла у меня следующее:

C++
1
2
3
    int number;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> number;
В этом то и проблема. После этого он символ новой строки оставляет во входной очереди. Во-вторых, когда цикл закончится первый раз, строка cin >> cr[i].age; ему не помешает, так как cin.get(), находящийся выше всех гетлайнов, примет конец строки из входной очереди и очистит её. Иначе тогда бы пришлось написать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int number;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> number
//принимает символ новой строки
cin.get();
    int j = number;
    car *cr = new car [number];
 
    for (int i = 0; i < number; i++)
    {
        cout << "Автомобиль #" << number - --j << endl << endl;
        cout << "Введите производителя: ";
        getline(cin, cr[i].name);
        cout << "Укажите год выпуска: ";
        cin >> cr[i].age;
//опять принимает символ новой строки. Проще добавить cin.get() в начале цикла
cin.get()
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 12:38     Создать динамическую струтуру-массив с типом string и int
Еще ссылки по теме:

Создать объединение, что содержит элементы типов char int short fload long string - C++
всем доброго времени суток! мне нужно создать объединение, что содержит элементы типов char int short fload long string. создать массив...

Как использовать символьный тип данных с типом int? - C++
Как использовать символьный тип данных с типом int?

Программа не работает с типом string - C++
В фукции main, строка NodeQueue&lt;string&gt; data; При вводе элементов программа тупо вылетает. С int float и char работает, но мне нужна...

Сравнение строк с типом string - C++
Приветствую уважаемые посетители сей темы! Хотелось бы узнать как можно сравнить переменную типа string? (Возможно есть какой то прототип...


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

Или воспользуйтесь поиском по форуму:
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
31.07.2014, 12:38     Создать динамическую струтуру-массив с типом string и int #10
Вместо cin.get() лучше тогда уж перед каждым getline делать следующее:
C++
1
std::cin.ignore( std::cin.rdbuf()->in_avail() );
Потому как после введеных цифр могут оказаться например пробелы или еще что.
Yandex
Объявления
31.07.2014, 12:38     Создать динамическую струтуру-массив с типом string и int
Ответ Создать тему
Опции темы

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