C ++ Char Array, удаляющий повторяющиеся символы

0

Привет, я просто ищу помощь с этим, я написал быстрый фрагмент кода, чтобы взять массив символов, который затем будет запущен через функцию, которая удалит любые повторяющиеся символы. У меня небольшая ошибка, так как она не удаляет последнюю повторяющуюся букву здесь это код, который я также выведет на выходе после кода.

#include <iostream>

#include <fstream>

#include <ostream>

using namespace std;

const int max_num_chars=10;

void deleteRepeats(char c[], int& size);


int main()
{
    char c[]={'a','b','b','b'};
    int c_size=4;

    cout<<"This Program reads characters into a partially filled array and then delete repeats! \n";
    cout<<"Here is the original array \n";
    for (int i=0;i<c_size;i++)
    {
        cout<<c[i]<<"\n";
    }
    deleteRepeats(c, c_size);
    cout<<"Here is the array after the deleteRepeats function! \n";
    for (int i=0;i<c_size;i++)
    {
        cout<<c[i]<<"\n";
    }
    system("pause");
    return 0;
}
void deleteRepeats(char c[],int& size)
{
    int num = size;
    int start = 0;

    while(start != num)
    {
        char test = c[start];
        for(int i = start+1; i <= num;i++)
        {
            if(test==c[i])
            {
                for(int j = i;j<num;j++)
                    {
                    c[j] = c[j+1];
                    }
                num-=1;
            }
        }
    start +=1;
    }
    size = num;
}

Вот результат... Эта программа читает символы в частично заполненный массив, а затем удаляет повторные торты! Вот исходный массив a b b b Вот массив после функции deleteRepeats! a b b Нажмите любую клавишу, чтобы продолжить. , ,

Извините, я просто понял это, добавив этот бит кода, который он исправил

for(int j = i;j<num;j++)
                    {
                    c[j] = c[j+1];
                    }
                num-=1;
                start-=1; 
Теги:
arrays

2 ответа

1

Хотя для этого есть лучший алгоритм. В твоем случае:

Внутри функции "deleteRepeats" внутри цикла "for (int я = start + 1; я <= num; i++)"

когда вы удаляете следующий один и тот же элемент, вы вызываете "i", не учитывая, что теперь при одном и том же "i" также может быть повторяющийся элемент после удаления.

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

for(int i = start+1; i <= num;i++)
    {
        if(test==c[i])
        {
            for(int j = i;j<num;j++)
                {
                c[j] = c[j+1];
                }
            num-=1;
          // correction
            i--;
          // correction
        }
    }

Если у вас возникли проблемы с пониманием, ответьте...

0

Почему у вас две вложенные циклы, когда вам нужен только один?

void deleteRepeats(char c[], int& size) {
    // Trivial case of empty array: do nothing.
    if(size <= 0) // Why is 'size' a signed 'int' and not 'size_t'?
        return;

    // First character is automatically not a repetition.
    // So for each character from the second onward,
    // move it if it is different from the previous character,
    // otherwise skip over it.
    char* read = c + 1;
    char* write = read;
    char* end = c + size;
    char prev = *c;
    while(read != end) {
        if(*read != prev) {
            prev = *read;
            *write++ = prev;
        }
        ++read;
    }

    // Finish up.
    size = write - c;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню