удалить все вхождения символа в строке C - пример необходим - PullRequest
7 голосов
/ 12 ноября 2010

InputString: "I am unwell" "We need to go to the doctor" "How long will it take?".

OutputString: I am unwell We need to go to the doctor How long will it take?

Строка должна быть очищена от всех вхождений символа ".Я могу подумать о следующем подходе

  1. Использование функции strchr () при первом обнаружении "
  2. Перемещение всех символов в строке на одну позицию влево

Повторяйте шаги 1 и 2, пока strchr () не вернет нулевой указатель.

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

Ответы [ 4 ]

18 голосов
/ 12 ноября 2010
for (s=d=str;*d=*s;d+=(*s++!='"'));
9 голосов
/ 12 ноября 2010

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

псевдокод:

  1. Начинайте с двух указателей: SOURCE и DESTINATION. Они оба указывают на первый символ строки.
  2. Если * SOURCE == NULL установить * DESTINATION = NULL. Стоп.
  3. Если * SOURCE! = "Установить * DESTINATION = * SOURCE и увеличить DESTINATION.
  4. Увеличить SOURCE,Переходите к шагу 2.

код:

// assume input is a char* with "I am unwell\" \"We need to go..."

char *src, *dest;

src = dest = input;    // both pointers point to the first char of input
while(*src != '\0')    // exit loop when null terminator reached
{
    if (*src != '\"')  // if source is not a " char
    {
        *dest = *src;  // copy the char at source to destination
        dest++;        // increment destination pointer
    }
    src++;             // increment source pointer
}
*dest = '\0';          // terminate string with null terminator              

// input now contains "I am unwell We need to go..."

обновление : исправлены некоторые ошибки в коде

0 голосов
/ 12 ноября 2010

Если ваша строка не очень большая, очевидный ответ будет иметь отдельную строку. Один цикл до \ 0 (конец строки) Иметь цикл (Дает вам O (n)) и сравнение, чтобы проверить, является ли текущее местоположение строки соответствующим символом (снова O (n))

Всего:


  s1 = original array
  s2 = new array to store the final result
  c = character in question.  
  current_pointer = 0 
  new_pointer =0 
  while(s1[current_pointer] != '\0') {
   ele = s1[current_pointer] ;

   if( ele != c)  { 
    s2[new_pointer++] = ele
   }
    current_pointer++
  }

Обратите внимание, что этот метод работает только тогда, когда размеры строк невелики. Нам нужно искать лучшие методы, так как размер строки увеличивается.

Надеюсь, это поможет.

0 голосов
/ 12 ноября 2010

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

Это минимизирует количество копируемых символов, копируя каждый действительный символ один раз. При использовании оригинального метода символы в конце строки копируются n раз, где n - количество недопустимых символов перед ним.

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