|
помогите - Вопросы и ответы, обсуждения - Ваши вопросы по C/C++ только в данном разделе |
09.10.2013, 12:05
|
#1
|
|
|
|
Сержант
|
Регистрация: 24.07.2011
Сообщений: 153
Популярность: 15622
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 4,294,967,295
Поблагодарили 521 раз(а) в 159 сообщениях
|
помогите
1. Посмотрите на main(). Там вызываются различные функции. От вас требуется реализовать str_cpy() и str_cat(). Функции str_printf() и str_free() реализовывать не надо.
2. Прочтите внимательно main(), чтобы понять прототип и использование str_cpy() и str_cat().
3. Код, написанный вами, должен соответствовать по качеству библиотечному коду, как в хорошей реализации libc.
4. Обратите внимание на 4 заголовочных файла перед функцией main. Вы можете использовать функции, описанные в этих файлах, в своей реализации str_cpy() и str_cat()
5. Замечание: эффективная реализация функций str_cpy и str_cat умещается в 7 строк кода на функцию.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
int main(int argc, char *argv[])
{
char *s = NULL;
str_cpy(&s, "Hola Hola");
str_cpy(&s, s+5);
str_cat(&s, " World");
str_printf(&s, "%s!", s);
puts(s); /* result: "Hola World!" */
str_free(&s);
return 0;
}
Последний раз редактировалось ™PO.100.B™; 09.10.2013 в 12:14.
|
|
|
10.10.2013, 08:43
|
#2
|
|
|
|
Пехотинец
|
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
|
Re: помогите
Собственно, тебе нужно контролировать выделение/освобождение памяти внутри твоих функций (ибо изначально передается указатель на NULL).
У меня к тебе вопрос: зачем во все функции с префиксом str_ передается char **, когда было б достаточно char * ?
|
|
|
10.10.2013, 17:38
|
#3
|
|
|
|
Сержант
|
Регистрация: 24.07.2011
Сообщений: 153
Популярность: 15622
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 4,294,967,295
Поблагодарили 521 раз(а) в 159 сообщениях
|
Re: помогите
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
void str_cpy(char **s, const char *word) {
size_t size = sizeof(char) * strlen(word) + 1;
if ((*s = malloc(size)) != NULL)
{
memcpy(*s, word, size);
}
}
void str_cat(char **s, const char *word) {
if (*s == NULL) {
return;
}
size_t old_size = sizeof(char) * strlen(*s);
size_t size = sizeof(char) * strlen(word) + 1;
if ((*s = realloc(*s, old_size + size)) != NULL);
{
memcpy(*s + old_size, word, size);
}
}
void str_printf(char **s, const char *format, const char *word)
{
sprintf(*s, format, word);
}
void str_free(char **s) {
free(*s);
*s = NULL;
}
int main(int argc, char *argv[])
{
char *s = NULL;
str_cpy(&s, "Hola Hola");
str_cpy(&s, s+5);
str_cat(&s, " World");
str_printf(&s, "%s!", s);
puts(s); /* result: "Hola World!" */
str_free(&s);
//char hello[] = "hello"; char *hello_ptr = hello;
//str_cat(&hello_ptr, " World"); /* oops =C */
return 0;
}
нужно оптимизировать посильнее
|
|
|
11.10.2013, 15:57
|
#4
|
|
|
|
Разведчик
|
Регистрация: 19.06.2013
Сообщений: 12
Популярность: 340
Сказал(а) спасибо: 2
Поблагодарили 8 раз(а) в 3 сообщениях
|
Re: помогите
|
|
|
14.10.2013, 08:45
|
#5
|
|
|
|
Пехотинец
|
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
|
Re: помогите
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 18:26.
|
|