|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.02.2013, 13:31 | #1 |
Регистрация: 31.01.2013
Сообщений: 4
|
Реализовать Функцию, Которая "тиражирует" Строку на Си (C)
1. Реализуйте функцию со следующим прототипом:
int autoStringMultiply(AutoString *string, unsigned multiplier); Данная функция "тиражирует" строку, адресуемую string, multiplier раз. В случае успеха возвращается 0, в противном случае -- -1. В качестве решения принимается файл с именем solution.c, в котором записываются решения всех заданий. (Соответствующие фрагменты кода помечаются комментариями, указывающими, к какому заданию относится конкретный фрагмент.) Файл main.c содержит директиву #include "solution.c", определение функции main, типов AutoString и TextFileDrawer, а так же функций их размещения и освобождения в памяти (и некоторых других полезных вспомогательных функций). Внутри функции main разрешается поместить код, проверяющий, по мнению студента, работоспособность реализованных функций. Студент получает 0 баллов за задание, если компилятор gcc, запущенный с опциями -std=c99 -pedantic -Wall, в процессе компиляции файла main.c выдает ошибки (errors), относящиеся к строкам, соответствующим данному заданию. Оценка за задание снижается на 1 балл, если в процессе компиляции возникают предупреждения (warnings), относящиеся к строкам, соответствующим данному заданию. Для получения максимального балла за задание, реализованные функции должны: * соответствовать своему прототипу; * верно модифицирует соответствующие структуры данных, переданные по ссылке в качестве аргументов, в соответствии с заданием; * выделяет не более и не менее необходимого объема памяти с помощью функции malloc или аналогов, если это предполагается по заданию; * использует realloc там, где это более предпочтительно; * освобождает требуемую память с помощью функции free и только ее, если это предполагается по заданию; * эффективно использует функции memcpy, memmove, strstr и т.п. вместо циклов. * проверяет входные аргументы на допустимость (включая возможность переполнения в ходе выполнения арифметических операций), где это возможно, и игнорирует свой вызов в случае некорректных аргументов; * проверяет значения, возвращаемые вызываемыми функциями, и прекращает работу в случае ошибки, сохраняя целостность данных; * в случае успеха возвращает 0, в противном случае -- -1. * не содержит иных побочных эффектов. Если хотя бы один из этих пунктов нарушается хотя бы для одного набора входных значений, оценка снижается как минимум на 1 балл. В случае несоответствия определения функции прототипу или нарушения каких-либо пунктов для существенного диапазона аргументов, оценка снижается как минимум на 2 балла. * Дополнительные требования: ** если значение string->native_string равно NULL, данная строка должна трактоваться как пустая; ** любое значение string->native_string, не равное NULL, должно быть массивом символов, размещенным в динамической области памяти (только если оно не const), последний элемент которого -- терминальный символ '\0'. |
06.02.2013, 14:01 | #2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
1) Где описание AutoString?
2) Где описание TextFileDrawer? 3) Что значит "тиражирует"? Приписывает в конец существующей? А так система ограничений замечательная, мой респект автору задания. |
07.02.2013, 01:56 | #3 |
Регистрация: 31.01.2013
Сообщений: 4
|
1. Описание библиотеки AutoString
AutoString — это библиотека, предоставляющая функции для работы с так называемыми «автоматическими строками», автоматически управляющими памятью, необходимой для их хранения. Тип AutoString определяется следующим образом: typedef struct AutoString { char *restrict native_string; size_t size; } AutoString; Поле native_string хранит указатель на динамическую область памяти, в которой хранится массив символов, представляющий соответствующую строку (включая терминальный символ '\0) или NULL для пустой строки. Поле size хранит размер строки. Для типа AutoString const допускается значение поля native_string с типом char const *, а так же ссылающееся не на динамическую область памяти. Соответственно, допускается использование литералов следующего вида: (AutoString const) { .native_string = "123", .size = 3 } 2. Функции autoStringAllocate и autoStringRelease Функция autoStringAllocate определена следующим образом: AutoString *autoStringAllocate(char const *native_string) { AutoString *string = malloc(sizeof(AutoString)); if (!string) return NULL; string->size = strlen(native_string); string->native_string = malloc(string->size + 1); if (!string->native_string) { free(string); return NULL; } strcpy(string->native_string, native_string); return string; } Данная функция конструирует автоматическую строку из обычной. Создается копия строки, размещенная в динамической области памяти. Если возникли проблемы с выделением памяти, возвращается NULL. В противном случае возвращается указатель на проинициализированную структуру AutoString. Автоматические строки, созданные с помощью функции autoStringAllocate, хранятся в динамической области памяти. Для освобождения ресурсов используется функция autoStringRelease, определенная следующим образом: void autoStringRelease(AutoString *string) { if (string) { if (string->native_string) free(string->native_string); free(string); } } 3. Функция autoStringMultiply Функция autoStringMultiply(AutoString *string, unsigned multiplier) тиражирует содержимое string->native_string multiplier раз. Функция возвращает -1, если в итоге может получится слишком длинная строка или были проблемы с выделением дополнительной памяти. При этом строка *string не меняется. В случае успеха возвращается 0. Если native_string аргумента указывает с NULL, после вызова функции autoStringMultiply он будет указывать на пустую строку (состоит из одного единственного терминального символа). Реализация функции выглядит так: int autoStringMultiply(AutoString *string, unsigned multiplier) { if (!(string->size <= SIZE_MAX / multiplier)) return -1; char *native_string = realloc(string->native_string, string->size * multiplier + 1); if (!native_string) return -1; string->native_string = native_string; native_string += string->size; while (--multiplier > 0) { memcpy(native_string, string->native_string, string->size); native_string += string->size; } *native_string = '\0'; string->size *= multiplier; return 0; } Сначала осуществляется проверка допустимости увеличения размера строки в multiplier раз (значение поля size не может превосходить SIZE_MAX). Затем осуществляется попытка выделить необходимый объем памяти. Далее необходимое количество раз происходит копирование с помощью функции memcpy исходной строки в нужную позицию, сдвигаемую каждую итерацию вправо на string->size байт. Наконец, в конце хранимой строки ставится терминальный символ, а так же обновляется значение поля size. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ввести строку и после каждого символа "q" ставить "**" | karamzin | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 25.11.2012 02:57 |
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") | funnyy | Помощь студентам | 3 | 17.10.2012 17:40 |
Pascal ABC строки - программа, которая каждую встреченную букву "б" заменяет сочетанием "ку" (использовать модули) | Raigo | Помощь студентам | 6 | 17.05.2012 15:35 |
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. | воваава | Помощь студентам | 3 | 01.12.2011 12:50 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |