Найти одинаковые символы в строке и заменить их на последовательность - 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);
}

Объяснение кода листинга программы

  1. В функции str_pack_rep происходит обработка входной строки s.
  2. Строка s копируется в t, чтобы сохранить исходное значение.
  3. Переменная e инициализируется последним символом строки s.
  4. Переменная l инициализируется длиной строки s.
  5. Переменная n инициализируется значением 1.
  6. В цикле пока *s не равно \0, происходит следующее:
  7. Переменная p инициализируется s + 1.
  8. В цикле пока *p не равно \0 и *p равно *s, происходит следующее:
  9. Переменная n увеличивается на 1.
  10. Переменная i инициализируется значением 1.
  11. Если n больше 4, происходит следующее:
  12. Переменная k инициализируется значением 4 - n.
  13. Если (l + k + 1) >= bufsize, происходит выход из цикла.
  14. Строка s сдвигается на k символов вправо.
  15. Переменная l увеличивается на k.
  16. Если n меньше 4, происходит следующее:
  17. Переменная k инициализируется значением 4 - n.
  18. Строка s сдвигается на k символов влево.
  19. Переменная l уменьшается на k.
  20. Переменная s увеличивается на 1.
  21. В строку s записывается символ (.
  22. В строку s записывается строка, полученная из d, в обратном порядке.
  23. В строку s записывается символ ).
  24. Если n больше 4, происходит следующее:
  25. Переменная a инициализируется значением s.
  26. Переменная b инициализируется значением s + (n - (3 + i)).
  27. В цикле пока *a не равно \0, происходит следующее:
  28. Символ *a заменяется на символ *b.
  29. Переменная a увеличивается на 1.
  30. Переменная b увеличивается на 1.
  31. Переменная s устанавливается равной a.
  32. В функции int_to_str происходит преобразование числа в строку.
  33. Переменная p инициализируется значением d.
  34. Переменная c инициализируется значением *p.
  35. Переменная q инициализируется значением p - 1.
  36. В цикле пока n не равно 0, происходит следующее:
  37. Переменная *d инициализируется значением (n % 10) + '0'.
  38. Переменная n делится на 10.
  39. Переменная d увеличивается на 1.
  40. Переменная t устанавливается равной d.
  41. Если d не равно t, происходит следующее:
  42. В цикле пока p меньше q, происходит следующее:
  43. Переменная c инициализируется значением *p.
  44. Символ *p заменяется на символ *q.
  45. Символ *q заменяется на c.
  46. Переменная p увеличивается на 1.
  47. Переменная q уменьшается на 1.
  48. Функция str_pack_rep возвращает отформатированную строку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы