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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2019, 13:50   #1
Breezes
Пользователь
 
Регистрация: 18.10.2018
Сообщений: 14
По умолчанию [C++] Строка с пробелами

Всем доброго времени суток. В одной из частей кода требуется ввести строку с пробелами. Делаю я следующим образом:
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class tovar
{
private:
	static int count;
	int id;
protected:
	char *name;
	int price;
	char* company;
public:
	tovar();
	int get_price() { return price; }
	~tovar();
	void out();
};
int tovar::count = 0;
tovar::tovar()
{
	char s1[60];
	char s2[60];
	count++;
	id = count;
	cout<< "Введите наименование товара ";
	cin.getline(s1,60);
	name = new char[strlen(s1)];
    cin.get();
	strcpy(name, s1);
	cout<< "Цена: ";
	cin>>price;
	cout<< "Введите наименование производителя ";
	cin>> s2;
	company = new char[strlen(s2)];
	strcpy(company, s2);
}
При этом Цена наезжает на наименование товара:

Попробовал вставить cin.get() после ввода строки, но тогда вся программа летит к чертям:

Как ввести строки без ущерба для остальной части программы? Вообще, задание звучит следующим образом:

Построить иерархию классов: Товар (наименование, цена, производитель), Молоко (срок хранения, объем). В каждом классе предусмотреть функции чтения/записи, конструктор, деструктор и статическое поле «количество». Создать динамически n записей производного класса. Вывести сведения о записях. Отсортировать записи по числовому полю.

Вот мой код к ней:
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class tovar
{
private:
	static int count;
	int id;
protected:
	char *name;
	int price;
	char* company;
public:
	tovar();
	int get_price() { return price; }
	~tovar();
	void out();
};
int tovar::count = 0;
tovar::tovar()
{
	char s1[60];
	char s2[60];
	count++;
	id = count;
	cout<< "Введите наименование товара ";
	cin.getline(s1,60);
	name = new char[strlen(s1)];
    cin.get();
	strcpy(name, s1);
	cout<< "Цена: ";
	cin>>price;
	cout<< "Введите наименование производителя ";
	cin>> s2;
	company = new char[strlen(s2)];
	strcpy(company, s2);
}
tovar::~tovar()
{
	cout<< " Удален объект ID: " << id << ".NAME: " << name;
}
void tovar::out()
{
	cout<<"id: "<< id << ". Name: " << name << " Price: " << price << " Company: " << company;
}
class milk :public tovar
{
protected:
	static int count;
	int id;
	int shelf_life;
	int volume;
public:
	milk();
	~milk();
	void out();
	int get_shelf_life() { return shelf_life; }
	void swap(milk *);
};
int milk::count = 0;
milk::milk() : tovar()
{
	count++;
	id = count;
	cout<< "Введите срок хранения молока в днях: ";
	cin>>shelf_life;
	cout<< "Введите объем молока: ";
	cin>>volume;
}

milk::~milk()
{
	cout<< "\n Удален объект " <<id<< "." <<name<< " сроком хранения " <<shelf_life<< " c объемем молока " <<volume;

}
void milk::out() {
	cout<<" \nid: " << id << ". name:  " << name << " price: " << price << " company: " << company << " shelf life: " <<shelf_life<< "\n";

}
int vvod()
{
	cout<< "Введите кол-во записей: ";
	int z;
	cin>> z;
	return z;
}
void milk::swap(milk *obj)
{
	int temp = obj->id;
	obj->id = id;
	id = temp;

	temp = obj->price;
	obj->price = price;
	price = temp;

	temp = obj->shelf_life;
	obj->shelf_life = shelf_life;
	shelf_life = temp;

	temp = obj->volume;
	obj->volume = volume;
	volume = temp;

	char *h = obj->name;
	obj->name = name;
	name = h;

	char *t = obj->company;
	obj->company = company;
	company = t;
}
void sort(milk *b, int n)
{
	for (int i = 0; i< n - 1; i++)
		for (int j = i + 1; j < n; j++)
		{
			if (b[i].get_shelf_life() > b[j].get_shelf_life())
				b[i].swap(&b[j]);
		}
}
int main()
{
system("chcp 1251");
	system("cls");
	int a = vvod();
	milk *arr = new milk[a];
	for (int i = 0; i< a; i++)
		arr[i];
	for (int i = 0; i< a; i++)
		arr[i].out();
	cout<< "\n Cортировка: ";
	sort(arr, a);
	for (int i = 0; i< a; i++)
		arr[i].out();
	cout<< "\nУдаление";
	delete[] arr;
	/*cout<< "\n\nПроверкатого,что удалилось:";
	for (inti = 0; i< a; i++)
	arr[i].out();*/
	cin.get();
	cin.get();
	return 0;
}
Без пробелов все работает отлично, но с пробелами в строках начинаются проблемы.
P.S Прошу прощения за громадное сообщения, спойлеров не нашел в редакторе.
______________________
Используйте тег [CODE] (кнопка [CODE] в форме сообщения) при вставке кода на форум. Подробнее в FAQ

Последний раз редактировалось Breezes; 18.05.2019 в 13:59.
Breezes вне форума Ответить с цитированием
Старый 18.05.2019, 16:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Начните с простого - strlen возвращает длину без \0, а вы памяти выделяете столько.

и после
Код:
	cout<< "Введите кол-во записей: ";
	int z;
	cin>> z
вставьте игноре на макс \n
p51x вне форума Ответить с цитированием
Старый 18.05.2019, 17:12   #3
Breezes
Пользователь
 
Регистрация: 18.10.2018
Сообщений: 14
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Начните с простого - strlen возвращает длину без \0, а вы памяти выделяете столько.

и после
Код:
	cout<< "Введите кол-во записей: ";
	int z;
	cin>> z
вставьте игноре на макс \n
Немного не понял про игноре. Я добавил сюда:
Код:
int vvod()
{
	cout<< "Введите кол-во записей: ";
	int z;
	cin>> z;
	cin.ignore(0,'/n');
	return z;
}
Вот что получилось:

При вводе Названия товара в консоли появляется число 10, а строки производителя считываются только до 1 пробела.
Breezes вне форума Ответить с цитированием
Старый 18.05.2019, 17:21   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Мда... если вы так читаете, то у вас проблемы.
Ни 0, а максимум std::numeric_limits<std::streamsize >::max()
Ни '/n', а '\n'.
p51x вне форума Ответить с цитированием
Старый 18.05.2019, 18:54   #5
Breezes
Пользователь
 
Регистрация: 18.10.2018
Сообщений: 14
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Мда... если вы так читаете, то у вас проблемы.
Ни 0, а максимум std::numeric_limits<std::streamsize >::max()
Ни '/n', а '\n'.
Максимальное число символов в строке у меня 60. Вот как я изменил:
Код:
int vvod()
{
	cout<< "Введите кол-во записей: ";
	int z;
	cin>> z;
	cin.ignore(60,'\n');
	return z;
}
Но проблема не исчезла. Что я делаю не так?

Последний раз редактировалось Breezes; 18.05.2019 в 19:55.
Breezes вне форума Ответить с цитированием
Старый 18.05.2019, 19:04   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Давайте еще раз:
std::numeric_limits<std::streamsize >::max()
\n
p51x вне форума Ответить с цитированием
Старый 18.05.2019, 19:55   #7
Breezes
Пользователь
 
Регистрация: 18.10.2018
Сообщений: 14
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Давайте еще раз:
std::numeric_limits<std::streamsize >::max()
\n
Прошу прощения, опечатался в сообщении. В среде разработки слэш был указан верно. Но, как я писал выше, проблема осталась.
Исправил в сообщении.
Breezes вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строка с положительными числами, разделенными пробелами. Составить новую строку из чисел фибоначчи (на С) Pantheon Помощь студентам 0 12.03.2014 23:31
Дана строка,слова разделены пробелами thedoctor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 08.01.2014 14:04
Входной информацией является строка - последовательность слов,разделенных пробелами. borntank Помощь студентам 3 26.04.2013 20:30
Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Odinsoon Паскаль, Turbo Pascal, PascalABC.NET 0 24.04.2013 18:46
дана строка символов ,разделённые пробелами(одним или несколькими) и не содержащие пробелов внутри себя,б Aktor1992 Паскаль, Turbo Pascal, PascalABC.NET 1 12.04.2011 22:19