Удалить пробелы из строки, но не в начале или в конце - PullRequest
11 голосов
/ 17 февраля 2010

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

Например

hello  everyone this     is a test

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

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

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

  • сделать цикл for для длины строки

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

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

Ответы [ 5 ]

4 голосов
/ 17 февраля 2010

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

2 голосов
/ 17 февраля 2010

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

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

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

Пример:

         write
          V
xxxx_xxxx__xxx
           ^
          Read
0 голосов
/ 17 февраля 2010

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

0 голосов
/ 17 февраля 2010

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

РЕДАКТИРОВАТЬ - упс - неправильно с Гозом, хотя формулировка "extra one" будет правильно охватывать только серии из двух пробелов.

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

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

0 голосов
/ 17 февраля 2010

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

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