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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 17:16   #31
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Вот реализация string, правда без операторов << и >>: http://pastebin.com/N5EHrzms
Там как раз используется грамотное динамическое увеличение размера массива.
Мало того, вчитайся в char& operator*() — занятное решение.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 21.01.2011, 02:56   #32
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
Восклицание

Цитата:
Сообщение от S1av0k Посмотреть сообщение
Ох, спасибо за советы, приму к сведению
В main() строка девятая снизу, если Вы про ту строчку кода. Причем аварийная остановка случается сразу же после нажатия интер при вводе первой строки, что, казалось бы, к изменению строки кода отношения не имеет...(как минимум очевидного для меня)
Только я не видела обнуления строк в вашем коде... Всегда нужно обнулять строки (см. мой пример), перед вводом информации ! new сама по себе не обнуляет память, только выделяет. Функции ввода-вывода еще под DOS разработаны, они обрабатывают строку, пока не встретят 0. Если 0 нету в выделенной памяти, они залазят в чужую память ( та, которая не выделена для вашего приложения). В операционной системе есть защита памяти - если какая либо программа попытается прочитать или записать чужую в память, то сразу будет заблокирована.
Везде, после выделения памяти нужно ее обнуление.
Использовать нужно memset( строка, 0, число байтов) !
strlen, strcpy - не учитывают нуль-символ, его нужно добавлять в ручную, или заранее обнулить всю строку !
Цитата:
Сообщение от S1av0k Посмотреть сообщение
Код:
String::String(const String& qw)									//копирующий конструктор
	{
		if (this != &qw)
			{
				int length = strlen(qw.mass);
				delete [] mass;
				mass = new char[length];
				strcpy(mass,qw.mass);
			}	
	}
Тут ошибка ! strlen возвращает длину строки без учена нуль-символа. А значит такая строка не будет гарантированно оканчиваться на 0.
Код:
				int length = strlen(qw.mass);
				delete [] mass;
				mass = new char[length+1];
				strcpy(mass,qw.mass);
                                mass[length] =0;

Последний раз редактировалось An1ka; 21.01.2011 в 03:34.
An1ka вне форума Ответить с цитированием
Старый 21.01.2011, 13:37   #33
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
new сама по себе не обнуляет память, только выделяет.
Небольшая поправка. Это в C были malloc и calloc, а в C++ new может как инициализировать, так и не инициализировать.
Вот: http://www2.research.att.com/~bs/bs_faq2.html#malloc

Цитата:
Везде, после выделения памяти нужно ее обнуление.
Не обязательно обнуление.

Цитата:
Функции ввода-вывода еще под DOS разработаны, они обрабатывают строку, пока не встретят 0.
Обижаете! Гораздо раньше MS-DOS. Эта операционка к C вообще слабо относится.

Ну а так всё верно. Разве что также вы можете использовать strlcpy, вместо strcpy и ручного дописывания нуль-символа.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 21.01.2011 в 13:40.
Obey-Kun вне форума Ответить с цитированием
Старый 21.01.2011, 19:16   #34
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Цитата:
mass = new char[length+1];
не соглашусь ни разу. Надо учитывать, что индексация строк начинается с нуля.

и если уж на то пошло, то не
Цитата:
mass[length] =0;
a всё-таки так

Код:
 mass[length] ='\0';
Помог - жми весы

Последний раз редактировалось S1av0k; 21.01.2011 в 19:23.
S1av0k вне форума Ответить с цитированием
Старый 22.01.2011, 06:27   #35
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
Небольшая поправка. Это в C были malloc и calloc, а в C++ new может как инициализировать, так и не инициализировать.
Вот: [url]http://www2.research.att.com/~bs/bs_faq2.html#malloc[/url
Так инициализирует только первый символ. А тут у нас массивы

Цитата:
Сообщение от S1av0k Посмотреть сообщение
не соглашусь ни разу. Надо учитывать, что индексация строк начинается с нуля.
Причем тут индексация и выделение памяти ??
Выделение памяти начинается с 1. А индексация с 0.
Код:
mass[length] =0;
mass[length] ='\0';
Это одно и тоже
Только в первом случае представление, не как символ, а как ASCII код символа.
Можно еще:
Код:
mass[length] =0x0;
Шестнадцатеричное преставление.
An1ka вне форума Ответить с цитированием
Старый 22.01.2011, 16:20   #36
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Это одно и тоже
Но второе красивше. Это хороший тон использовать '\0' для букв, NULL для указателей, true/false для bool и т.д. Просто с первого взгляда понятно, с чем работаем.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
классы вида for="..." и class="A B C" Darkstar100 HTML и CSS 5 19.01.2010 20:06
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04