Описать функцию 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.