Как удалить символ из строки с
Перейти к содержимому

Как удалить символ из строки с

  • автор:

Как удалить символ из строки с

Если надо добавить в конец строки другую строку, применяется метод append() , в который передается добавляемая строка:

Вставка строки

Для вставки одной строки в другую применяется функция insert() . Она имеет несколько различных версий. Самая простая версия принимет индекс вставки и вставляемую строку:

В данном случае в строку text начиная с 7-го индекса вставляем строку str. В итоге переменная text будет равна «insert a string into a text».

Также можно вставлять строковый литерал:

Можно вставлять часть подстроки:

Здесь в text вставляем из переменной langs 3 символа с 5-го индекса, то есть подстроку » C,».

Среди других версий функции insert() также следует отметить версию, которая позволяет вставить определенный символ определенное число раз:

В данном случае вставляем в строку text символ * 5 раз начиная с 8 индекса.

Замена подстроки

Для замены в строке некоторой части применяется функция replace() . Эта функция также имеет много версий, поэтому рассмотрим самые распространенные.

Самая простая версия принимает три параметра:

Первый параметр — представляет индекс, с которого надо заменять подстроку. Второй параметр — количество заменяемых символов. Третий параметр — на какую строку надо заменить. Пример:

Здесь в строке text заменяем 4 символа с 6-го индекса на строку «C++». Таким образом, из строки «Lang: Java» мы получим строку «Lang: C++».

В предыдущем примере символы заменялись на строковый литерал. Но также можно заменять на объект string:

Нередко стоит задача заменить какой-то определенную подстроку, индекс которой может быть не известен. В этом случае мы можем воспользоваться поиском в строке, чтобы найти индекс подстроки и ее размер. Например, возьмем текст «Hello, Tom!» и заменим подстроку «Tom» на «Bob»:

Здесь находим позицию первого символа подстроки «Tom» в тексте и сохраняем ее в переменную start. Символ, следующий за последним символом подстроки «Tom», находится путем поиска символа разделителя из строки separators с помощью функции find_first_of() . Далее используем найденные позиции индекса в replace() .

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

Здесь сначала находим индекс первого вхождения подстроки, которую надо заменить, и сохраняем этот индекс в переменную start. В цикле заменяем последовательно все вхождения подстроки. После каждой замены находим индекс следующего вхождения, сохраняем его в переменную start и повторяем цикл. Когда больше нет вхождений подстроки в текст, start будет содержать значение std::string::npos , что завершает цикл.

Из других версий функции replace() можно выделить функцию, которая заменяет подстроку определенным символом, который повторяется определенное количество раз:

Здесь заменяет в строке text 6 символов начиная с 9-го индекса на 5 символов *.

Удаление символов

Если надо не просто заменить символы, а удалить их из текста, также можно использовать функцию replace() — в этом случае удаляемые символы фактически заменяются на пустую строку:

Однако С++ также предоставляет для удаления символов специальную функцию — erase() . В качестве параметров она принимает начальный индекс удаления и количество удаляемых символов:

Аналогично можно удалить все вхождения определенной подстроки:

Функция erase() имеет ряд дополнительных версий. Так, можно оставить определенное количество символов с начала строки, а остальные удалить:

Если в функцию не передается никаких параметров, то она удаляет все символы, и в результате получаем пустую строку:

Стоит отметить, что в стандарт С++20 была добавлена функция std::erase() , которая удаляет все вхождения определенного символа в строке:

Remove characters from C# string

How might I remove characters from a string? For example: «My name @is ,Wan.;’; Wan» .

I would like to remove the characters ‘@’, ‘,’, ‘.’, ‘;’, ‘\» from that string so that it becomes «My name is Wan Wan»

22 Answers 22

But I may suggest another approach if you want to remove all non letter characters

Enigmativity's user avatar

Sounds like an ideal application for RegEx — an engine designed for fast text manipulation. In this case:

Comparing various suggestions (as well as comparing in the context of single-character replacements with various sizes and positions of the target).

In this particular case, splitting on the targets and joining on the replacements (in this case, empty string) is the fastest by at least a factor of 3. Ultimately, performance is different depending on the number of replacements, where the replacements are in the source, and the size of the source. #ymmv

Results

Test Harness (LinqPad)

dotNET's user avatar

Less specific to your question, it is possible to remove ALL punctuation from a string (except space) by white listing the acceptable characters in a regular expression:

Note there is a space after that 9 so as not to remove spaces from your sentence. The third argument is an empty string which serves to replace any substring that does not belong in the regular expression.

Esteban Verbel's user avatar

The simplest way would be to use String.Replace :

Here’s a method I wrote that takes a slightly different approach. Rather than specifying the characters to remove, I tell my method which characters I want to keep — it will remove all other characters.

In the OP’s example, he only wants to keep alphabetical characters and spaces. Here’s what a call to my method would look like (C# demo):

Here’s my method:

Another simple solution:

Taking the performance figures from @drzaus, here is an extension method that uses the fastest algorithm.

A string is just a character array so use Linq to do the replace (similar to Albin above except uses a linq contains statement to do the replace):

The first string is the string to replace chars in and the second is a simple string containing the chars

I might as well throw this out here.

Make an extension to remove chars from a string:

And it’s usable like this:

Or just like this:

It seems that the shortest way is to combine LINQ and string.Concat :

See the C# demo. Note that string.Concat is a shortcut to string.Join(«», . ) .

Note that using a regex to remove individual known chars is still possible to build dynamically, although it is believed that regex is slower. However, here is a way to build such a dynamic regex (where all you need is a character class):

C++. Работа со строками. Класс string. Конструкторы класса. Функции assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Примеры

Класс string предназначен для работы со строками типа char* , которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char* . Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку <string> и пространство имен std .

3. Каким образом осуществляется объявление переменной типа string ? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char* ?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char* . В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ ( = , + , = = , <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char* , есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string ?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • < – меньше
  • <= – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

8. Присваивание строк. Функция assign() . Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’ ;
  • использовать функцию assign() из класса string .

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

В этом случае происходит простое присваивание одной строки другой.

Второй вариант позволяет копировать заданное количество символов из строки:

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st ;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

  • s – строка, которая завершается символом ‘\0’ ;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s .

Ниже приведен пример с разными реализациями функции assign() .

Пример.

9. Объединение строк. Функция append() . Пример

Для объединения строк используется функция append() . Для добавления строк также можно использовать операцию ‘+’ , например:

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

В первом варианте реализации функция получает ссылку на строчный объект s , который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char * , которая завершается символом ‘\0’ .

Пример. Демонстрация работы функции append() .

10. Вставка символов в строке. Функция insert() . Пример

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

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

Второй вариант функции позволяет вставить часть (параметры insStart , num ) строки s в заданную позицию start вызывающей строки:

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s ;
  • insStart – позиция в строке s , из которой происходит вставка;
  • num – количество символов в строке s , которые вставляются с позиции insStart .
11. Замена символов в строке. Функция replace() . Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

В первом варианте реализации вызывающая строка заменяется строкой s . Есть возможность задать позицию ( start ) и количество символов ( num ) в вызывающей строке, которые нужно заменить строкой s .

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s . В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s , которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace() .

12. Удаление заданного количества символов из строки. Функция erase() . Пример

Для удаления символов из вызывающей строки используется функция erase() :

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

13. Поиск символа в строке. Функции find() и rfind() . Примеры

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

  • путем просмотра строки от начала до конца с помощью функции find() ;
  • путем просмотра строки от конца к началу функцией rfind() .

Прототип функции find() имеет вид:

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s . Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Пример 2. Демонстрация работы функции rfind() .

14. Сравнение частей строк. Функция compare() . Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’ . Если две строки одинаковы, то результат сравнения будет true . В противном случае, результат сравнения будет false .

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare() .

Прототип функции compare() :

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s , из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s , которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s , то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s , функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare() :

15. Получение строки с символом конца строки ‘\0’ ( char * ). Функция c_str() . Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str() .

Функция объявлена с модификатором const . Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char * .

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application .

16. Как определить длину строки типа string ? Функция length()

Для определения количества символов в строке используется функция length() без параметров.

Удалить символ, C

Как удалить символ из строки char* в си? Имею строки, у которых в конце \n. Надо этот перенос строки убрать.

Как заменить отдельный символ? И как найти именно последний символ в строке (позицию)?

Ты вроде препод в универе?
Не стыдно?

Строка — это массив.

Artificial_Thought> Строка — это массив.

А, уже понял. Найду длину — найду последний символ. Всем спасибо за ответы.

Массив постоянной длины.

man memmove, если удалять надо много — лучше создать новую строку из старой

Тогда посмотри по лекциям за 1 курс:
1) Что обычно из себя представляет «строка» на Си.
1.1) Чем она заканчивается.
3) Алгоритм линейного поиска.

Факультативно:
Стандартная библиотека Си.

Artificial_Thought> Массив постоянной длины.

И как тогда ее изменить? Мне же нужно сделать на 1 символ меньше.

> И как тогда ее изменить? Мне же нужно сделать на 1 символ меньше.

tip: строка заканчивается \0

Обычно — просто указатель на кусок говнапамяти.

char *pos = strrchr(str, ‘\n’);
if (pos)
str[pos-str] = 0;

В любом случае realloc() сделает совсем не то, что надо ТС.

if (pos) *pos = 0, не?

А если в строке не будет ‘\n’?

Конечно же просто *pos = 0, питоновские срезы строк переклинили меня.

Artificial_Thought> А если в строке не будет ‘\n’?

То будет плохо. Но пока код и так костыльный, полировать буду позже, когда хоть как-то заработает.

if ( str[strlen(str)- 1] == ‘\n’) str[strlen(str) — 1]=’\0′;

Студент помог студенту =) В каком институте и на каком курсе не знают такие вещи?

Dikar> В каком институте и на каком курсе не знают такие вещи?

В политехе на пятом 😀 Программирование закончилось на втором (или на первом, не помню).

Какой ужас. Мсье знает, что строка будет пройдена два раза, чтобы вычислить это выражение?

Буду рад увидеть более интересный вариант, если это конечно не :

Именно этот. А более интересный тут нельзя дать, элементарщина же.

Вы всё ещё кипятите? Тогда мы идём к вам!

P.S. Я не несу никакой ответственности за возможные тяжкие увечья, помутнение рассудка, массовые разрушения и другие катаклизмы, к которым может привести использование этого куска кода.

> int pos=strlen(str)- 1;

если строка может быть нулевой длины, то

ну тогда уж так

а если в середине ‘\n’ и нужно затереть только последний, то

незя, т.к. не гарантировано, что разыменование len будет выполнено до (s[len-1] == ‘\n’), но в 99.9% случаев сработает.

Зачёт! Самый быстрый, надежный и читаемый в мире код! (:

>незя, т.к. не гарантировано, что разыменование len будет выполнено до (s[len-1] == ‘\n’), но в 99.9% случаев сработает.

Учи матчасть. Что такое «разыменование len» я не понял, но если len != 0, то следующее выражение гарантированно не будет вычисляться.

len == 0 там, конечно имелось ввиду.

Читайте K&R, на x86[_64] подобное работает, а на другой архитектуре выражение в скобках может вычисляться справа налево.

Иван, Вы в таких соревнованиях случаем не учавствуете? =)

2 Eddy_Em
[quote]
Имеется соответствующая операция && для AND. Выражения, связанныеоперациями && или ||, рассматриваются слева на право, и при этомгарантируется, что оценивание выражений будет прекращено, как толькостанет ясно, является ли все выражение истинным или ложным. Так, если’c’ оказывается пробелом, то нет никакой необходимости проверять,является ли ‘c’ символом новой строки или табуляции, и такие проверкидействительно не делаются. В данном случае это не имеет принципиальногозначения, но, как мы скоро увидим, в более сложных ситуациях этаособенность языка весьма существенна.
[/quote]

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

Это из K&R, если что.

Зависит от компилятора, а также от оптимизаций.
Если нужно записать в одну строчку, можно так:

>да, вычисление выражения будет прекращено, но порядок вычисления может быть иным

Ну вроде в КиР говорится именно о порядке вычисления. А ссылку можно на что-нибудь, где это оговаривается?

> Зависит от компилятора, а также от оптимизаций.

А можно пример такого компилятора+оптимизации, который вычисляет справа налево?

>А можно пример такого компилятора+оптимизации, который вычисляет справа налево?

А важнее даже не пример, а возможно ли такое согласно стандартам.

Ну вот 6.5.13 часть C99 гласит:
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
there is a sequence point after the evaluation of the first operand. If the first operand
compares equal to 0, the second operand is not evaluated.

5.1.2.3:
Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all side effects,11) which are changes in the state of
the execution environment. Evaluation of an expression may produce side effects. At
certain specified points in the execution sequence called sequence points, all side effects
of previous evaluations shall be complete and no side effects of subsequent evaluations
shall have taken place. (A summary of the sequence points is given in annex C.)

Позор. Немедленно google: ISO 9899:1999 и читать до просветления.
Вот до чего доводит обучение по самоучителям и прочим туториалам.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *