Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2014, 16:18   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию Ввести имя в элемент структуры (массив символов)

Подскажите, что сделано не так в следующем коде?
Код:
#include<iostream>
using namespace std;

struct Person
{
	char name[32];
	int age;
};

void showData(const Person Obj[], int amount);

int main()
{
	setlocale(LC_ALL, "rus");

	const int amountOfPerson = 3;
	Person P[amountOfPerson] = {};

	for (int i = 0; i < amountOfPerson; i++)
	{
		cout << "Имя: ";
		cin.getline(P[i].name, 32);
		cout << "Возраст: ";
		cin >> P[i].age;
	}
	
	showData(P, amountOfPerson);

	return 0;
}

void showData(const Person Obj[], int amount)
{
	for (int i = 0; i < amount; i++)
	{
		cout << "Имя: " << Obj[i].name << endl;
		cout << "Возраст: " << Obj[i].age << endl;
		cout << endl;
	}
}
Проблема в том, что когда цикл for переходит к следующему шагу, ввод имени уже нельзя сделать. Сразу предлагает ввести возраст:

Имя: Andrew
Возраст: 30
Имя: Возраст: _
marenko.lilia вне форума Ответить с цитированием
Старый 23.09.2014, 16:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

cin.getline(P[i].name, 32); наверное не учитывает нажатый энтер.
Не помню как из этого выкручивались. То ли cin.flush() то ли еще как.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2014, 17:29   #3
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Прата С. пишет "Функция getline () читает целую строку, используя символ новой строки, который передан клавишей <Enter>, для обозначения конца ввода. "

По идее должно быть все в порядке. Но на деле почему-то не так
marenko.lilia вне форума Ответить с цитированием
Старый 23.09.2014, 18:11   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

После cin >> P[i].age; в буфере чего-то там остаётся и автоматом читается через getline без ожидания ввода пользователем. Пробуйте добавить вышеуказанный flush
pu4koff вне форума Ответить с цитированием
Старый 23.09.2014, 18:19   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тут уже обсуждался этот глюк. Порой на форуме по слову getline(). Было такое несколько раз.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2014, 18:41   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Ну, это не глюк, а особенности. Еще можно попробовать вводить длинные имена, в качестве возраста вбить цифры с пробелами. Я бы на учебных задачах не заморачивался и слепил работу с консолью лишь бы работало
pu4koff вне форума Ответить с цитированием
Старый 23.09.2014, 19:10   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А использование cin & cout обязательно или, может быть, ну их в жо?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.09.2014, 19:14   #8
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Необязательно! Но так интересно же, как его заставить работать.
Мне интересно как строку с клавиатуры ввести.
С этим flush ничего не получилось.
Я убрала getline() и стало нормально работать.

Код:
for (int i = 0; i < amountOfPerson; i++)
{
	cout << "Имя: ";
	cin >> P[i].name;
	cout << "Возраст: ";
	cin >> P[i].age;
}

Последний раз редактировалось marenko.lilia; 23.09.2014 в 19:58.
marenko.lilia вне форума Ответить с цитированием
Старый 23.09.2014, 19:22   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Не обязательно! Но так интересно же, как его заставить работать.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.09.2014, 19:58   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,342
По умолчанию

Цитата:
Сообщение от marenko.lilia Посмотреть сообщение
Я убрала getline() и стало нормально работать.
А теперь введите имя, букв на 40...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран ok57 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 17.05.2013 05:07
Ввести последовательность символов [ Senya Black ] Помощь студентам 1 08.05.2012 19:11
Ввести строку длиной до 30 символов istavzev Помощь студентам 0 03.05.2012 12:31
невозможно ввести в поле более 30 символов brutalis БД в Delphi 2 20.10.2011 11:25
Ввести имя файла с клавиатуры,открыть если существует,перименовать и переместить его mulatoschka1990 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 23.10.2009 16:18