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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2012, 17:54   #1
migimigi
Новичок
Джуниор
 
Регистрация: 19.08.2012
Сообщений: 2
По умолчанию Реализация strcpy и strcat (С++)

Доброго времени суток!

Вот моя реализация функции strcpy. Вроде работает.
Такое решение имеет место быть или здесь что-то не так?

Код:
void mystrcpy(char *first, char *second) 
{
	while(*second) {
		*first++ = *second++;
	}
	*first = '\0';
}

Аналогичный вопрос с функцией strcat.

Код:
void mystrcat (char *first, char *second)
{
	while (*first) first++;
		while (*second) {
			*first++ = *second++;
		}
}
migimigi вне форума Ответить с цитированием
Старый 19.08.2012, 19:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что-то не так?
А память где выделяется?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 20:42   #3
migimigi
Новичок
Джуниор
 
Регистрация: 19.08.2012
Сообщений: 2
По умолчанию

Я чайник совсем, поэтому прошу простить за идиотский вопрос: а как выделяется память? И под что она тут должна выделяться? Если я захочу использовать функцию mystrcpy(s1, "Hello!"), предварительно объявив массив char s1[80], например, разве память под массив не выделится автоматически?
migimigi вне форума Ответить с цитированием
Старый 19.08.2012, 20:44   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А память где выделяется?
Там же, где и у стандартных strcpy/strcat...
А вот проверять аргументы не мешало бы... также стринг second лучше сделать const...

Ну наконец открыть исходник C библиотеки и посмотреть как там сделано
waleri вне форума Ответить с цитированием
Старый 19.08.2012, 20:44   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, ни та, ни та функция не выделяют память.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2012, 21:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ни та, ни та функция не выделяют память.
Эт я понял.
Просто допустим я прошляпничал и для second выделил мало памяти для копирования строки - получается функция залезет на чужую территорию.
Я бы лучше так не делал, я бы выделял память внутри функций, и возвращал указатель на совсем новую строку, не трогая исходные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 22:18   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эт я понял.
Просто допустим я прошляпничал и для second выделил мало памяти для копирования строки - получается функция залезет на чужую территорию.
Я бы лучше так не делал, я бы выделял память внутри функций, и возвращал указатель на совсем новую строку, не трогая исходные.
Но тогда нельзя будет выделить память под строку в стеке, или переиспользовать выделенную ранее память. В определённом смысле, стандартная strcpy более гибкая функция, впрочем, большинство реализаций поддерживают strdup из стандарта POSIX, которая делает именно то, что Вы описываете.
netrino вне форума Ответить с цитированием
Старый 19.08.2012, 23:01   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эт я понял.
Просто допустим я прошляпничал и для second выделил мало памяти для копирования строки - получается функция залезет на чужую территорию.
Я бы лучше так не делал, я бы выделял память внутри функций, и возвращал указатель на совсем новую строку, не трогая исходные.
Да, вы правы, но увы, таков стандарт языка.

А вот в вашем варианте кто будет освобождать память? Уж тогда лучше передавать размера обоих буферов, правда тогда выходит на первый план проблема в каких единицах размер буферов - в байтах или в символах.
waleri вне форума Ответить с цитированием
Старый 19.08.2012, 23:08   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тогда нельзя будет выделить память под строку в стеке, или переиспользовать выделенную ранее память.
Ну чем-то пожертвовать всетки придется
Как мне кажется лучше пойти в сторону безопасного кодирования.
Цитата:
А вот в вашем варианте кто будет освобождать память?
Согласен. Но все же забыть освободить память не так катастрофично как не зарезервировать ее. Плохо, но не смертельно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 23:20   #10
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

По поводу самого первого топика: где проверка размера передаваемых массивов в явном виде?
Почитай книгу "Программированию боевого софта под Linux", там подробно расписаны шаманства с буфером, в том числе, как избежать переполнения буфера.
Berlioz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
strcat,strcpy Акоб Общие вопросы C/C++ 15 24.04.2011 23:58
Реализация функции strcat. KOPC1886 Помощь студентам 2 25.01.2011 17:48
Моя strcat Valter Общие вопросы C/C++ 5 12.02.2010 00:30
strcat larry Win Api 3 20.07.2009 12:44
не работает strcat(),strcpy() MeGaTpoH Общие вопросы C/C++ 5 25.01.2009 17:31