Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 42
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. Учу 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++. Результат один и тот же. Ошибок компилятора нет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2014, 11:21
Ответы с готовыми решениями:

Преобразовать массив с типом char в массив с типом int
Что-то не получается у меня найти инфу именно с преобразованием массивов с char в int. Нахожу...

Too few parameters in call to 'Lechebnica::AddNewElement(int,int,string,string,int,string)
Edit1 Id Edit2 Имя Edit3 Фамилия Edit4 Номер телефона ComboBox1 Услуга ...

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

Операция ||: нельзя применить с типом int и int
Добры день. Подчеркивает такую подстроку кода (MSB &lt;&lt; 8) || LSB) и пишет что нельзя применить с...

9
102 / 93 / 36
Регистрация: 01.04.2013
Сообщений: 654
31.07.2014, 11:28 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;
}
0
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 42
31.07.2014, 11:36  [ТС] 3
Не помогло. Не понимаю в чём причина.

Добавлено через 3 минуты
Факт в том, что если просто добавить в этот цикл сосвем другую стринг переменную, которая вообще не относится к структуре, происходит тоже самое (!). Или если вынести getline(cin, cr[i].name); за пределы цикла то тоже самое.
0
102 / 93 / 36
Регистрация: 01.04.2013
Сообщений: 654
31.07.2014, 11:39 4
Как это не помогло? У меня всё работает как надо (компилятор MSVS 2010)
0
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 42
31.07.2014, 11:47  [ТС] 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;
}
0
Модератор
Эксперт С++
13678 / 10888 / 6465
Регистрация: 18.12.2011
Сообщений: 29,050
31.07.2014, 11:53 6
Лучший ответ Сообщение было отмечено proninyaroslav как решение

Решение

Весь сыр-бор из-за следующего
Цитата Сообщение от Firework Посмотреть сообщение
cin >> cr[i].age;
После этого чтения указатель входного потока cin стоит на символе конца строки ('\n')
Соответственно в цикле следующая операция чтения строки getline(cin, cr[i].name);
воспринимает этот символ за целую (пустую) строку.
Я этот нюанс решаю простым дополнительным чтением символа
C++
1
2
сin >> cr[i].age;
cin.get();
1
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 42
31.07.2014, 11:57  [ТС] 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() завершается.
0
Модератор
Эксперт С++
13678 / 10888 / 6465
Регистрация: 18.12.2011
Сообщений: 29,050
31.07.2014, 12:10 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();
0
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 42
31.07.2014, 12:21  [ТС] 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()
    }
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
31.07.2014, 12:38 10
Вместо cin.get() лучше тогда уж перед каждым getline делать следующее:
C++
1
std::cin.ignore( std::cin.rdbuf()->in_avail() );
Потому как после введеных цифр могут оказаться например пробелы или еще что.
1
31.07.2014, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2014, 12:38
Помогаю со студенческими работами здесь

Тип int не совпадает с типом int list
Хочу получить результат например такого выражения arr. &lt;- arr. % 10 подчеркивает 10. Собственно...

Преобразовать массив String в двумерный массив int
Всем привет. Имеется массив String a, в котором хранятся числа. Требуется преобразовать его в...

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

Конвертация string в массив int
Помогите пожалуйста, имеется string c 22500 подряд записанных цифр типа&quot;11100452...01528&quot;...

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

Вывести двумерный массив с int и string
Здравствуйте, снова задачка с массивами, на этот раз дан двумерный массив в него необходимо вписать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru