В C, как удалить все символы, присутствующие в одном массиве из другого массива? - PullRequest
1 голос
/ 04 марта 2011

В C, как удалить все символы, присутствующие в одном массиве, из другого массива?

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

Звучит как домашняя работа, но вот решение.

Создайте массив из 256 записей, например char set[256]. Прочитайте первую строку. Для каждого символа c установите set[(unsigned char)c] в 1. Прочитайте и скопируйте вторую строку. Для каждого символа c, если set[c], то пропустить c.

Я забыл и пропустил, что вы должны сначала memset(set, 0, sizeof(set)), прежде чем устанавливать любое из его значений в 1.

2 голосов
/ 04 марта 2011

Предположим, вы хотите удалить символы в a0, которые существуют в a1.Сначала создайте логический массив, где каждый индекс является символом.ех.x ['c'] будет истинным, если 'c' найден в a1.Затем переберите a0, проверяя массив x, чтобы увидеть, следует ли сохранять или отбрасывать символ.При необходимости вы можете создать новый массив с удаленными элементами.Это должна быть операция O (n).

2 голосов
/ 04 марта 2011

Если это числа:

Вы не можете "удалить" их, но вы можете либо установить для них значение 0 (или любое другое значение, которое может представлять удаление в вашем случае), либо создать новый массивкоторый содержит числа, которые не принадлежат подмножеству двух массивов.

Метод грубой силы заключается в использовании двух вложенных for петель

, если они char s:

, вы можете "удалить" их, "сдвинув" -«замена» - «перемещение» всех символов, которые не принадлежат к общему подмножеству слева, а затем установите нулевой терминатор в нужном месте.(если вы не связываетесь со строковыми литералами (char * p = "lala"), это нормально).Это в значительной степени заставит char, которые обычно исчезают.

1 голос
/ 04 марта 2011
void remove_repeated(char* s, char* another)
{
    // ... preparation with another... see other answers
    for (pos = p = s; *p != 0; p++)
    {
        if (!macro_is_repeated(*p))
           *pos++ = *p;
    }
    *pos = 0;
}

См. Другие ответы для части is_repeated.

...