Удаление определенной последовательности символов в строке - C (СИ)
Формулировка задачи:
Здравствуйте! Есть строка (массив символов). Нужно найти наиболее длинную цепочку с повторяющимися символами и заменить ее числом повторений и одним символом, который повторялся.
Например, у нас есть строка "yyqwyyyyyyaxcсс"
А должно получиться: "yyqw6yaxc", т. к. последовательность из символ 'y' была наиболее длинной и повторилась шесть раз, а остальные символы 'y' в цепочке убрались
задание нужно реализовать при помощи указателей.
Задание реализовал, но не до конца- остановился на удалении лишних элементов. Т.Е. моя программа находит длинную последовательность, заменяет последние два символа из цепочки количеством повторений и самим символом. НО как удалить лишние из цепочки реализовать не получается....
П.С. в программе, для наглядности, символ, который был повторен максимальное количество раз заменен на 'X'
(для правильного отображения нужно *(arr + 1) = 'X'; заменить на *(arr + 1) = *sign
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void input(char *arr,int *siz) { gets_s(arr,*siz); } void dec(char *arr, char *sign, int *max, int *count) { for (*arr; *arr != '\0'; *arr++) { if (*arr == *(arr + 1)) //сравниваем соседние элементы { (*max)++; if (*max > *count) //отбираем самую длинную последовательность { *count = *max; //count - сколько наибольшее колличество раз повторился символ *sign = *arr; //sign- какой символ повторился } } else *max = 1; } } void Search(char *arr, char *sign, int *count) { int max_2 = 1; for (; *arr != '\0'; *arr++) { if (*arr == *(arr + 1)) //сравниваем соседние элементы { max_2++; if (*arr == *sign && max_2 == *count) //заменяет символы { char c = *count + '0'; //переводим int в char *arr = c; *(arr + 1) = 'X'; break; } } else max_2 = 1; } } void output(char *arr) { printf("%s",arr); } int main() { int siz = 1024; char *arr = (char*)malloc(siz*sizeof(char)); //выделям память под динамический массив char sign = 0; int count = 0; int max = 1; input(arr,&siz); dec(arr, &sign, &max, &count); Search(arr, &sign, &count); output(arr); free(arr); //освобождаем память system("pause"); }
Решение задачи: «Удаление определенной последовательности символов в строке»
textual
Листинг программы
#include <stdio.h> static char* find_maxseq(char* s, size_t* n); static size_t int_to_str(size_t n, char* s); void pack_rep_nch(char* s); int main(void){ char s[] = "XXX-ZZZ-YYYYYYYYYYYY"; pack_rep_nch(s); puts(s); return 0; } //задание void pack_rep_nch(char* s){ size_t n, i; char* p; if((p = find_maxseq(s, &n)) != NULL){ i = int_to_str(n, p) + 1; p += i; n -= i; s = p + n; while(*p) *p++ = *s++; } } //поиск одинаковых макс-символов static char* find_maxseq(char* s, size_t* n){ char* q, *p = NULL; size_t m = 1, k = 0; while(*s){ q = s + 1; while(*q && (*q == *s)) ++q; if((k = (size_t)(q - s)) > m){ m = k; p = s; } s = q; } *n = m; return p; } //преобразование числа в строку static size_t int_to_str(size_t n, char* s){ char t, *o, *q = s, *p = s; do { *s++ = (char)(n % 10) + '0'; } while((n /= 10) != 0); for(o = s--; s > p; --s, ++p){ t = *s; *s = *p; *p = t; } return (size_t)(o - q); }
Объяснение кода листинга программы
- В функции
main
создается строкаs
равнаяXXX-ZZZ-YYYYYYYYYY
. - Функция
pack_rep_nch
вызывается для строкиs
. - В функции
pack_rep_nch
происходит поиск наибольшей последовательности символов в строкеs
с помощью функцииfind_maxseq
. - Результат поиска наибольшей последовательности символов сохраняется в переменной
n
, а указатель на начало этой последовательности сохраняется в переменнойp
. - Затем происходит преобразование значения
n
в строку с помощью функцииint_to_str
, и результат сохраняется в переменнойs
. - Далее, в цикле, каждый символ из строки
s
копируется в строкуt
, пока не будет достигнут конец строкиs
. - В конце функции
main
выводится строкаs
. - Результатом работы программы будет строка
XXX-ZZZ-YYYY
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д