Подтвердить что ты не робот

Удалить пробелы из строки, но не в начале или в конце

Я пытаюсь удалить пробелы из строки в C, а не из конца, ни из начала, просто несколько пробелов в строке

Например

hello  everyone this     is a test

имеет два пробела между приветствием и всеми, а пять пробелов от этого до. В конечном счете, я хотел бы удалить 1 пространство из 2 и 4 из 5, так что каждый пробел имеет ровно 1 пробел. Есть смысл?

Это то, что я собирался сделать:

  • создайте указатель, укажите его на строку в элементе 1 char [0].

  • выполнить цикл for по длине строки

  • тогда моя логика заключается в том, что если мой указатель в [i] является пространством и моим указателем на пространстве элемента [i + 1], то что-то делать

Я не совсем уверен, что будет хорошим решением здесь, имея в виду, что я не буду использовать какие-либо заранее созданные функции. У кого-нибудь есть идеи?

4b9b3361

Ответ 1

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

Ответ 2

Можно ли использовать дополнительную память для создания дубликата строки или вам нужно выполнить обработку?

Самым простым будет распределение памяти в равной степени на размер исходной строки и копирование всех символов там. Если вы встретите дополнительное пространство, не копируйте его.

Если вам нужно сделать это на месте, создайте два указателя. Один указывает на считываемый символ и один на символ, который копируется. Когда вы встретите дополнительное пространство, приспособите указатель "read", чтобы указать на следующий символ без пробела. Скопируйте в позицию записи символ, на который указывает прочитанный символ. Затем переместите указатель чтения на символ после копируемого символа. Указатель записи увеличивается на единицу, всякий раз, когда выполняется копия.

Пример:

         write
          V
xxxx_xxxx__xxx
           ^
          Read

Ответ 3

Жесткая часть здесь заключается в том, что вы не можете легко удалить элемент из массива символов. Разумеется, вы можете сделать функцию, которая возвращает char [], который удаляет один конкретный элемент. Другим вариантом является создание дополнительного массива, который указывает, какие символы вы должны сохранить, а затем переходите через char [] еще раз, только копируя символы, которые вы хотите сохранить.

Ответ 4

Это основано на том, что сказал Гоз, но я думаю, что у него были проблемы с пальцами, потому что я уверен, что он описал бы все пробелы (а не только второй раз подряд).

РЕДАКТИРОВАТЬ - oops - неправильно в отношении Goz, хотя формулировка "лишний" будет правильно покрывать пробеги двух пробелов.

РЕДАКТИРОВАТЬ - oops - предварительно написанное решение удалено...

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

Ответ 5

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