Найти одинаковые символы в строке и заменить их на последовательность - 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
возвращает отформатированную строку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д