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

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

  1. В функции main создается строка s равная XXX-ZZZ-YYYYYYYYYY.
  2. Функция pack_rep_nch вызывается для строки s.
  3. В функции pack_rep_nch происходит поиск наибольшей последовательности символов в строке s с помощью функции find_maxseq.
  4. Результат поиска наибольшей последовательности символов сохраняется в переменной n, а указатель на начало этой последовательности сохраняется в переменной p.
  5. Затем происходит преобразование значения n в строку с помощью функции int_to_str, и результат сохраняется в переменной s.
  6. Далее, в цикле, каждый символ из строки s копируется в строку t, пока не будет достигнут конец строки s.
  7. В конце функции main выводится строка s.
  8. Результатом работы программы будет строка XXX-ZZZ-YYYY.

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


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

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

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