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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2012, 00:58   #1
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию ненавистные строки

есть класс Student
в нём определены методы на задание имени, фамилии, отчества и т.д.
сказали использовать не string строки, а char* (указатели на строки - мой камень преткновения )

реализация кода, покажу только нужное:

Код:
// в классе определены private поля
private:
char* surname;
char* name;
char* otchestvo;

//-------------------------------------------------------------------------
	void setStudent()
	{
		char *str1 = new char[15], *str2 = new char[15], *str3 = new char[15];
		int p;
		cout << "Введите фамилию: " ;
		fflush(stdin);
		cin.getline(str1, sizeof(str1));
		inputSurname(str1); //после этого динамит меня :)
		cout << "Введите имя: " ;
		fflush(stdin);
		cin.getline(str2, sizeof(str2));
		inputName(str2);
		cout << "Введите отчество: " ;
		fflush(stdin);
		cin.getline(str3, sizeof(str3));
		inputOtchestvo(str3);
		cout << "Введите код" ;
		cin>>p;
		setCode(p);
		delete str1;
		delete str2;
		delete str3;
	}

//метод задания элементов имеет такую структуру

	void inputSurname(char* str)
	{
		strcpy(surname, str);
	}

	void inputName(char* str)
	{
		strcpy(name, str);
	}

	void inputOtchestvo(char* str)
	{
		strcpy(otchestvo, str);
	}

выдаёт ошибку переполнения памяти что ли, после ввода фамилии
подскажите,пожалуйста, как решить проблему
Kaela вне форума Ответить с цитированием
Старый 06.09.2012, 02:44   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Не забывать про терминантный 0
Не забывать про выделение памяти под используемые переменные, например, surname
Использовать strncpy и подобные с контролем размера буфера.
p51x вне форума Ответить с цитированием
Старый 06.09.2012, 09:43   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Kaela

Да, для неокрепших телом и духом юных адептов C++ "старые добрые" строки в Си-стиле - это кошмар и ужОс (((((Ж

char *str1 = new char[15];

как ты думаешь, чему будет равно это выражение?

sizeof(str1)

strcpy(surname, str);

память кто будет выделять, Пушкин?

сказали использовать не string строки, а char*

А вообще, скажи преподу, что chsr* в C++ используют только ламеры, а чОткие патсаны юзают std::string o_O.

Последний раз редактировалось Rififi; 06.09.2012 в 09:46.
Rififi вне форума Ответить с цитированием
Старый 06.09.2012, 11:11   #4
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

p51x

так терминантный ноль оно же самостоятельно подставляет и при создании строки, и при использовании функций strcpy и strncpy

а память под 3 приватные переменные char* мне надо будет выделить в методах inputSurname и т.д.?
или может лучше в конструкторе?

следовательно освобождать память надо будет в деструкторе в обоих случаях?


Rififi

значение sizeof(str) будет равно 4, ведь это же указатель, позабывал всё

про выделение памяти тут strcpy(surname, str); вроде разобрался

вообще я преподу так и сказал, что нету смысла с указателями на char голову морочить, а она у нас молодая, видимо, сама не понимает, что получится слишком много ошибок, которые она сама не будет в состоянии объяснить
ну да это дело преподавателя
Kaela вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10