Удаление определенной последовательности символов в строке - 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.