@newmersedez

Почему неправильно вводятся данные в программе?

Хочу вводить данные об объекте класса, пока пользователь не захочет закончить ввод. Первый раз все ок, но во время второго ввода в первое поле класса почему-то что-то записывается. Почему так?
Вот программа:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include "competitionclass.h"

using namespace std;

int		main()
{
	int					choice = 1;
	Competition			temp_cat;
	vector<Competition> vector;
	cout << "Enter information about cats:" << endl;
	while (choice != 0)
	{
		temp_cat.initCat();
		vector.push_back(temp_cat);
		cout << "Do you want continue?(any num = yes/0 - no)";
		cin >> choice;
		cin.clear();
	}
	cout << endl;
	for (int i = 0; i < vector.size(); i++)
	{
		cout << i << ". Cat info:" << endl;
		vector[i].printCatInfo();
		cout << endl;
	}
	return 0;
}


Ошибка ввода выглядит так(почему он заполнил поле класса breed?):
Enter information about cats:
Enter breed of cat: maine coon
Enter name of cat: Lucie
Enter color of cat: smoke
Enter mother of cat: Lilly
Enter father of cat: Stan
Enter owner lastname: Ivanov
Enter age: 3
Enter position: 2
Do you want continue?(any num = yes/0 - no)1
Enter breed of cat: Enter name of cat: Koko
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
@Dalp
Для ввода информации в Competition::initCat() Вы используете getline(), который принимает весь буфер ввода.
Когда Вы вводите choice, Вы набираете "1" и перевод строки. В то время как "1" переходит из буфера в переменную choice, в буфере остаётся '\n' (символ перевода строки). Именно этот символ принимает функция getline(cin, breed).
Для решения проблемы можно почистить строку после ввода choice используя cin.ignore().
В данном случае можно использовать cin.ignore(1000, '\n'). Эта функция будет удалять символы из буфера до тех пор пока не встретит символ перевода строки, или пока не удалит 1000 символов. Однако этот способ не сработает если пользователь введёт число + 1000 пробелов + '\n', так как в таком случае символ перевода не удалится.
Во избежание данной проблемы вместо cin.ignore(1000, '\n'), лучше использовать cin.ignore(numeric_limits::max(), '\n'). Этот вариант точно очистит всю строку вместе с '\n', но для его использования нужно подключить библиотеку:
#include <limits>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы