Найти одинаковые символы в строке и заменить их на последовательность - C (СИ)
Формулировка задачи:
Задача: найти одинаковые символы в строке и заменить их на последовательность x(k) - где x - символ, k-количество его повторений. Алгоритм подсчета количество одинаковых символов - это же задание только в Си нужно
Решение задачи: «Найти одинаковые символы в строке и заменить их на последовательность»
textual
Листинг программы
#include <stdio.h> #define MAX_BSZ 256 static int int_to_str( char* d, int n); char* str_pack_rep(size_t bufsize, char* s); int main(void){ char s[MAX_BSZ] = "AABBCCDDEEFF !!!!!!!!!!!!!!!!!!!! kkk\n"\ "WWWWXXXXXXXXXX *** ## @@@@@\n"\ "BEGIN: TTTTTTTTTTTTTTTQQQQQQQQQQTTTT ~~~~~~~~~~ :END\n"; puts(s); puts( str_pack_rep(MAX_BSZ - 1, s) ); return 0; } //упаковка повторений по простому char* str_pack_rep(size_t bufsize, char* s){ int n, i, k; char d[9]; size_t l; char* p, *a, *b, *e, *t = s; for(e = s; *e; ++e); l = (size_t)(e - s); if((size_t)l + 1 >= bufsize) return t; while(*s){ p = s + 1; while(*p && (*p == *s)) ++p; n = (int)(p - s); if(n > 1){ i = int_to_str(d, n); if(n < 4){//растяжение k = 4 - n; if((l + k + 1) >= bufsize) break; for(a = e + k; a > p; --a) *a = *(a - k); e += k; l += k; } ++s; *s++ = '('; for(a = &d[0]; *a; *s++ = *a++); *s++ = ')'; if(n > 4){//сжатие a = s; b = s + (n - (3 + i)); while((*a = *b) != '\0'){ ++a; ++b; } } p = s; } s = p; } return t; } //преобразование числа в строку static int int_to_str(char* d, int n){ char* p, c, *q, *t = d; do { *d++ = (char)(n % 10) + '0'; } while((n /= 10) != 0); *d = '\0'; if(d != t){ for(p = t, q = d - 1; p < q; ++p, --q){ c = *p; *p = *q; *q = c; } } return (int)(d - t); }
Объяснение кода листинга программы
- В функции
str_pack_rep
происходит обработка входной строкиs
. - Строка
s
копируется вt
, чтобы сохранить исходное значение. - Переменная
e
инициализируется последним символом строкиs
. - Переменная
l
инициализируется длиной строкиs
. - Переменная
n
инициализируется значением 1. - В цикле пока
*s
не равно\0
, происходит следующее: - Переменная
p
инициализируетсяs + 1
. - В цикле пока
*p
не равно\0
и*p
равно*s
, происходит следующее: - Переменная
n
увеличивается на 1. - Переменная
i
инициализируется значением 1. - Если
n
больше 4, происходит следующее: - Переменная
k
инициализируется значением 4 -n
. - Если
(l + k + 1) >= bufsize
, происходит выход из цикла. - Строка
s
сдвигается наk
символов вправо. - Переменная
l
увеличивается наk
. - Если
n
меньше 4, происходит следующее: - Переменная
k
инициализируется значением4 - n
. - Строка
s
сдвигается наk
символов влево. - Переменная
l
уменьшается наk
. - Переменная
s
увеличивается на 1. - В строку
s
записывается символ(
. - В строку
s
записывается строка, полученная изd
, в обратном порядке. - В строку
s
записывается символ)
. - Если
n
больше 4, происходит следующее: - Переменная
a
инициализируется значениемs
. - Переменная
b
инициализируется значениемs + (n - (3 + i))
. - В цикле пока
*a
не равно\0
, происходит следующее: - Символ
*a
заменяется на символ*b
. - Переменная
a
увеличивается на 1. - Переменная
b
увеличивается на 1. - Переменная
s
устанавливается равнойa
. - В функции
int_to_str
происходит преобразование числа в строку. - Переменная
p
инициализируется значениемd
. - Переменная
c
инициализируется значением*p
. - Переменная
q
инициализируется значениемp - 1
. - В цикле пока
n
не равно 0, происходит следующее: - Переменная
*d
инициализируется значением(n % 10) + '0'
. - Переменная
n
делится на 10. - Переменная
d
увеличивается на 1. - Переменная
t
устанавливается равнойd
. - Если
d
не равноt
, происходит следующее: - В цикле пока
p
меньшеq
, происходит следующее: - Переменная
c
инициализируется значением*p
. - Символ
*p
заменяется на символ*q
. - Символ
*q
заменяется наc
. - Переменная
p
увеличивается на 1. - Переменная
q
уменьшается на 1. - Функция
str_pack_rep
возвращает отформатированную строку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д