Есть ли хороший способ удалить символ из строки, не копируя все символы, следующие за ним? - PullRequest
1 голос
/ 21 мая 2010
// The first example:
char text[] = "henri";
char *p;
p = text;
*(p + 1) = 'E'; // Output = hEnri
// Now If we want to remove the "e" ie hnri, we would go for?????
     *(p + 1)=????? 

Очевидный ответ - скопировать остаток массива "назад" на одну позицию. Но это кажется ... неприятным. Конечно, есть какой-то лучший способ?

Ответы [ 7 ]

4 голосов
/ 21 мая 2010

Копирование является лучшим решением и действительно единственным решением, когда вы удаляете элементы из массива. (Вы можете использовать специальный элемент в конце массива, но это все.) Я не понимаю, почему это так ужасно.

Вам нужно сделать одну из двух вещей. Оба включают некоторое копирование.

1) Скопируйте 'n' туда, где находится 'E', 'r' - туда, где находится 'n', 'i' - там, где находится 'r', а затем обнулите его. *

2) Скопируйте «h» туда, где находится «E», а затем всегда используйте указатель на новое местоположение «h». Это не всегда возможно.

3 голосов
/ 21 мая 2010
*++p = 'h';
puts(p);
1 голос
/ 21 мая 2010

Вы должны переместить всех оставшихся персонажей на один. Нельзя сказать "пропустить этот символ".

while (*p)
{
    *p = *p++;
}

edit: тьфу, как я сделал эту ошибку? Сейчас исправлено. p по-прежнему будет ненулевым в конце строки, но * p не будет.

0 голосов
/ 19 апреля 2011

Невозможно удалить что-либо из строки C без копирования следующих символов для заполнения отверстия.

Но вы могли бы изменить структуру данных и использовать что-то, кроме строки. Например, вы можете использовать массив или связанный список фрагментов строки. Это иногда называют «веревкой».

Конечно, когда вам нужно передать данные в какую-то другую функцию, которая ожидает строку C, вы должны скопировать всю вещь.

0 голосов
/ 22 мая 2010

Это должно сделать это:

memmove (p + 1, p + 2, 4);

Мы перемещаем четыре символа, потому что мы также хотим скопировать нулевой терминатор.

0 голосов
/ 21 мая 2010

Это не копирование массива. Я перемещаю данные в одном массиве.

for (p = text + 1; *p != '\0'; ++p) {
  *p = *p + 1;
}

Хакерское решение - поместить 'h' туда, где было 'e', ​​и вернуть указатель на новое начало.

*p + 1 = *p;
p = p + 1;
0 голосов
/ 21 мая 2010

переместить символы вниз на 1 после него (включая ноль в конце)

кстати, в конце вы получите два нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...