0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 13
1

Удаление определенной последовательности символов в строке

16.03.2017, 19:51. Показов 615. Ответов 4
Метки нет (Все метки)

Здравствуйте! Есть строка (массив символов). Нужно найти наиболее длинную цепочку с повторяющимися символами и заменить ее числом повторений и одним символом, который повторялся.
Например, у нас есть строка "yyqwyyyyyyaxcсс"
А должно получиться: "yyqw6yaxc", т. к. последовательность из символ 'y' была наиболее длинной и повторилась шесть раз, а остальные символы 'y' в цепочке убрались
задание нужно реализовать при помощи указателей.

Задание реализовал, но не до конца- остановился на удалении лишних элементов. Т.Е. моя программа находит длинную последовательность, заменяет последние два символа из цепочки количеством повторений и самим символом. НО как удалить лишние из цепочки реализовать не получается....
П.С. в программе, для наглядности, символ, который был повторен максимальное количество раз заменен на 'X'
(для правильного отображения нужно *(arr + 1) = 'X'; заменить на *(arr + 1) = *sign

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2017, 19:51
Ответы с готовыми решениями:

Удаление одинаковых символов в строке
Здравствуйте помогите решить задачу, Дана строка с набранным текстом надо удалить все одинаковые...

Удаление символов в динамической строке
Я уже долго возился с удалением символов но так нечего и не вышло. И гугл не помогает, по этому...

Удаление в строке введенного пользователем сочетания символов
Добрый день. Подскажите пожалуйста, как удалить в строке &quot;Ключ&quot;. Например, введено слово &quot;Hello&quot;,...

Найти в строке и удалить из нее последовательности повторяющихся символов
Найти в строке и удалить из нее последовательности повторяющихся символов (например,...

4
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
16.03.2017, 20:49 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char str[] = "yyqwyyyyyyyyyyyyyaxxxxxxxxxxxxxxxxxxxxxxxc";
    char *first, *last, *maxFirst, *maxLast, *ptr;
    int max = 0, flag = 0, count1 = 0, count2, tmp;
    for(ptr = str + 1; *ptr; ptr++){
        if(*ptr == *(ptr - 1)){
            if(!flag){
                first = ptr - 1;
                flag = 1;
            }
        }
        else{
            if(flag){
                last = ptr;
                flag = 0;
                if(last - first > max){
                    max = last - first;
                    maxFirst = first;
                    maxLast = last;
                }
            }
        }
    }
    if(max){
        if(max > 9){
            tmp = max;
            while(tmp){
                tmp /= 10;
                count1++;
            }
            tmp = max;
            count2 = count1;
            while(tmp){
                *(maxFirst + --count2) = 48 + (tmp % 10);
                tmp /= 10;
            }
            maxFirst += count1 + 1;
        }
        else{
            *maxFirst = max + 48;
            maxFirst += 2;
        }
        while(*maxLast){
            *maxFirst++ = *maxLast++;
        }
        *maxFirst = '\0';
        puts(str);
    }
    else
        puts("The string has no repetitions");
    return 0;
}
0
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 13
17.03.2017, 07:10  [ТС] 3
LFC, спасибо, но при такой последовательности "yyyyyrfrfrfryyyyyyyyyyyyyyy" программа отрабатывает не корректно и на выводе "5yrfrfrfryyyyyyyyyyyyyyy".
А с кодом, который я предоставил- все безнадежно?)
0
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
17.03.2017, 07:39 4
пардон,строки с 16 по 18 заменить на
C
1
2
3
4
5
 if(*ptr != *(ptr - 1) || *(ptr + 1) == '\0'){
            if(flag){
                last = ptr;
                if(*(ptr + 1) == '\0')
                    last = ptr + 1;
0
837 / 640 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
17.03.2017, 08:10 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2017, 08:10
Помогаю со студенческими работами здесь

Написать программу-драйвер delnchr-удаление в строке s n первых символов.
Пожалуйста помогите написать программу-драйвер delnchr-удаление в сроке s n первых символов ...

В заданной строке заменить все последовательности одинаковых символов длиной более двух на конструкцию
Не могу понять в чем ошибка... Прога не работает... Задание такое: В заданной строке заменить все...

Вывод матрицы в Си в определенной последовательности
Привет ребята. Есть такая задача. Есть матрица 2x6 и мне нужно вывести ее на экран в форме...

Дана строка символов, вывести последовательности символов, заключенные в скобки
(Помогите,пожалуйста) Дана строка символов. Признак конца-символ '\n'(перевод строки). Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru