/* Copyright (C) Hola 2012, 2013 * * Добро пожаловать на олимпиаду программистов Hola! * * ПРАВИЛА: * - Идеальное решение до 28-May-13 принесет вам 500 долларов США! * - В случае хорошего (но не идеального) решения, мы вышлем замечания, чтобы * помочь вам доработать код. * - Идеальный ответ со второй попытки принесет вам 250 долларов США. * * ИНСТРУКЦИЯ: * - Посмотрите на main(). Там вызываются различные функции. * - От вас требуется имплементировать str_cpy() и str_cat(). * - Функции str_printf() и str_free() имплементитовать не надо. * - Прочтите внимательно main(), чтобы понять прототип и использование str_cpy() и * str_cat(). * - Код, написанный вами, должен быть на уровне "библиотечного кода", подобно тому * как это сделано в хорошей имплементации libc. * - Обратите внимание на 4 заголовочных файла перед функцией main(). Вы можете * использовать функции, описанные в этих файлах, в своей реализации str_cpy() и * str_cat(). * - У вас есть 15 минут для решения задачи. * * Замечание: Функции str_cpy() и str_cat() можно реализовать эффективно не * более чем 7 строк кода на функцию, и менее чем за 5 минут. * * Отправьте решение на challenge@hola.org. Мы проверим его и сообшим * о результате в течение 3 дней. * * Удачи! */ #include #include #include #include /** * @brief str_cpy Функция копирования строки в указатель. Небезопасная, длинна строки определяется по \0 * @param s - указатель * @param word - строка */ 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); } } /** * @brief str_cat Функция добавления подстроки к указателю. Небезопасная. * @param s Указатель * @param word подстрока */ 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; }