Найти одинаковые символы в строке и заменить их на последовательность - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача: найти одинаковые символы в строке и заменить их на последовательность x(k) - где x - символ, k-количество его повторений. Алгоритм подсчета количество одинаковых символов - это же задание только в Си нужно

Решение задачи: «Найти одинаковые символы в строке и заменить их на последовательность»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define MAX_BSZ  256
  3. static int int_to_str( char* d, int n);
  4. char* str_pack_rep(size_t bufsize, char* s);
  5.  
  6. int main(void){
  7.     char s[MAX_BSZ] =
  8.     "AABBCCDDEEFF !!!!!!!!!!!!!!!!!!!! kkk\n"\
  9.     "WWWWXXXXXXXXXX *** ## @@@@@\n"\
  10.     "BEGIN: TTTTTTTTTTTTTTTQQQQQQQQQQTTTT ~~~~~~~~~~ :END\n";
  11.  
  12.     puts(s);
  13.     puts( str_pack_rep(MAX_BSZ - 1, s) );
  14.     return 0;
  15. }
  16.  
  17. //упаковка повторений по простому
  18. char* str_pack_rep(size_t bufsize, char* s){
  19.     int    n, i, k;
  20.     char   d[9];
  21.     size_t l;
  22.     char*  p, *a, *b, *e, *t = s;
  23.  
  24.     for(e = s; *e; ++e);
  25.     l = (size_t)(e - s);
  26.     if((size_t)l + 1 >= bufsize)
  27.         return t;
  28.  
  29.     while(*s){
  30.         p = s + 1;
  31.         while(*p && (*p == *s))
  32.             ++p;
  33.  
  34.         n = (int)(p - s);
  35.         if(n > 1){
  36.             i = int_to_str(d, n);
  37.  
  38.             if(n < 4){//растяжение
  39.                 k = 4 - n;
  40.                 if((l + k + 1) >= bufsize)
  41.                     break;
  42.  
  43.                 for(a = e + k; a > p; --a)
  44.                     *a = *(a - k);
  45.                 e += k;
  46.                 l += k;
  47.             }
  48.  
  49.             ++s;
  50.             *s++ = '(';
  51.             for(a = &d[0]; *a; *s++ = *a++);
  52.             *s++ = ')';
  53.  
  54.             if(n > 4){//сжатие
  55.                 a = s;
  56.                 b = s + (n - (3 + i));
  57.                 while((*a = *b) != '\0'){
  58.                     ++a;
  59.                     ++b;
  60.                 }
  61.             }
  62.             p = s;
  63.         }
  64.         s = p;
  65.     }
  66.     return t;
  67. }
  68.  
  69. //преобразование числа в строку
  70. static int int_to_str(char* d, int n){
  71.     char* p, c, *q, *t = d;
  72.     do {
  73.         *d++ = (char)(n % 10) + '0';
  74.     } while((n /= 10) != 0);
  75.     *d = '\0';
  76.  
  77.     if(d != t){
  78.         for(p = t, q = d - 1; p < q; ++p, --q){
  79.             c  = *p;
  80.             *p = *q;
  81.             *q = c;
  82.         }
  83.     }
  84.     return (int)(d - t);
  85. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы