Skip to content

Instantly share code, notes, and snippets.

@Apkawa
Last active December 18, 2015 21:39
Show Gist options
  • Save Apkawa/5849370 to your computer and use it in GitHub Desktop.
Save Apkawa/5849370 to your computer and use it in GitHub Desktop.
Hola hola
/* 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 минут.
*
* Отправьте решение на [email protected]. Мы проверим его и сообшим
* о результате в течение 3 дней.
*
* Удачи!
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
/**
* @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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment