Найти одинаковые символы в строке и заменить их на последовательность - 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возвращает отформатированную строку.