Описать функцию CompressStr(S) строкового типа, выполняющую сжатие строки - C (СИ)
Формулировка задачи:
Описать функцию CompressStr(S) строкового типа
, выполняющую сжатие строки S по следующему правилу: каждая подстрока строки S, состоящая из более чем четырех одинаковых символов C, заменяется текстом вида «С{K}», где K — количество символов C (предполагается, что строка S не содержит фигурных скобок «{» и «}»). Например, для строки S = «bbbccccce» функция вернет строку «bbbc{5}e». С помощью функции CompressStr сжать пять данных строк. Имеется обратная задача, и есть эта готовая на паскале, но нужно на С.Решение задачи: «Описать функцию CompressStr(S) строкового типа, выполняющую сжатие строки»
textual
Листинг программы
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <assert.h> #define MIN_CHARS_AMOUNT_TO_CONVERT 4 size_t count_same_chars(char const* str) { size_t count = 1; char ch = *str; while (*++str != '\0' && *str == ch) { ++count; } return count; } void compress_str(char * str) { size_t count; char * p; while (*str != '\0') { count = count_same_chars(str); if (count >= MIN_CHARS_AMOUNT_TO_CONVERT) { p = str; *++p = '{'; ++p; p += sprintf(p, "%u", (unsigned int)count); *p = '}'; strcpy(++p, str + count); str = p; } else { str += count; } } } int main() { char str1[] = "bbbccccce"; char str2[] = "bbbbcce"; char str3[] = "bbbccceee"; char str4[] = "aaaaaaaabbbbcccc"; char str5[] = "aabbbcccc"; char str6[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; char str7[] = "aaaaaaaaaabbbcccccccccccca"; compress_str(str1); compress_str(str2); compress_str(str3); compress_str(str4); compress_str(str5); compress_str(str6); compress_str(str7); assert(strcmp(str1, "bbbc{5}e") == 0); assert(strcmp(str2, "b{4}cce") == 0); assert(strcmp(str3, "bbbccceee") == 0); assert(strcmp(str4, "a{8}b{4}c{4}") == 0); assert(strcmp(str5, "aabbbc{4}") == 0); assert(strcmp(str6, "a{50}") == 0); assert(strcmp(str7, "a{10}bbbc{12}a") == 0); return EXIT_SUCCESS; }
Объяснение кода листинга программы
- В функции
compress_str
выполняется сжатие строкиstr
. - В функции
count_same_chars
подсчитывается количество одинаковых символов в строкеstr
. - В цикле
while
происходит проход по всем символам строкиstr
. - Если количество одинаковых символов (
count
) больше или равноMIN_CHARS_AMOUNT_TO_CONVERT
, то выполняется сжатие подстроки. - В подстроке, соответствующей
count
символам, заменяется на{count}
. - В
main
функции создаются строки для тестированияcompress_str
. - Функция
compress_str
вызывается для каждой из созданных строк. - Результат сжатия проверяется с помощью функции
assert
. - В случае ошибки, программа завершается с кодом ошибки
EXIT_FAILURE
. - В случае успеха, программа завершается с кодом успеха
EXIT_SUCCESS
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д