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

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

Например,

hello  everyone this     is a test

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

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

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

  • сделайте для цикла через длину строки

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

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

11
задан Bill the Lizard 16 September 2012 в 15:47
поделиться

5 ответов

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

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

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

Пример:

         write
          V
xxxx_xxxx__xxx
           ^
          Read
2
ответ дан 3 December 2019 в 11:20
поделиться

Вы можете перечислить brtype vob, отображая только то, что вам нужно с fmt _ ccase директивами:

cleartool lstype -kind brtype -invob \myVob

будет достаточно для выполнения некоторых grep, но для более компактного вывода:

cleartool lstype -kind brtype -invob \myVob -fmt "%u %Ad %N\n"

У вас будет только имя пользователя, дата и имя brtype, чтобы вы grp.

Обратите внимание на параметр % Ad : возраст в днях, чтобы можно было быстро определить brtype, созданный 30 дней назад.

-121--4268293-

в зависимости от используемого дистрибутива Linux вы, вероятно, найдете, что boost уже построен и упакован для вас, например, на Fedora «yum install boost»

-121--2240017-

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

0
ответ дан 3 December 2019 в 11:20
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 11:20
поделиться

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

Получатель не должен быть публичным - если вы хотите скрыть данные от «посторонних», но дать данные подклассам, используйте защищенный

-121--970526-

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

Лично мне нравится, чтобы все мои области были частными: это обеспечивает более чистое разделение между API и реализацией. Я рассматриваю взаимосвязь между суперклассом и подклассом как подобную взаимосвязи между вызывающим и вызываемым абонентами - изменения в базовой реализации не должны разрывать подклассы больше, чем они должны разрывать вызывающие абоненты. Имя поля является детализацией реализации, которая не должна влиять на другие классы.

Конечно, моя точка зрения иногда рассматривается как несколько крайняя...

-121--970524-

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

4
ответ дан 3 December 2019 в 11:20
поделиться

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

0
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: