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

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

  • автор:

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

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

#include #include int main() < std::string message< "hello">; message.append(" "); // добавляем пробел message.append("world"); // можно добавить по цепочке // message.append(" ").append("world"); std::cout 

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

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

#include #include int main() < std::string text ; std::string str ; text.insert(7, str); std::cout 

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

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

std::string text ; text.insert(6, "C/"); // Hello C/C++

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

std::string text ; std::string langs ; text.insert(6, langs, 5, 3); // Langs: C, C++

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

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

std::string text ; text.insert(8, 5, '*'); // Number: *****5678

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

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

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

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

std::string &std::string::replace(size_t _Off, size_t _Nx, const char *_Ptr)

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

#include #include int main() < std::string text ; text.replace(6, 4, "C++"); // Lang: C++ std::cout 

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

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

std::string text ; std::string lang <"C++">; text.replace(6, 4, lang); // Lang: C++

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

#include #include int main() < std::string text ; const std::string separators ; // разделители слова size_t start ; // находим позицию подстроки size_t end ; // Находим конец подстроки if(end == std::string::npos) // если разделители слова не найдены < end = text.length(); >text.replace(start, end - start, "Alice"); // заменяем подстроку std::cout 

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

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

#include #include int main() < std::string text ; std::string old_str; // какую подстроку заменить std::string new_str; // на какую строку заменить size_t start ; // находим позицию подстроки while (start != std::string::npos) // находим и заменяем все вхождения строки old_str < text.replace(start, old_str.length(), new_str); // Замена old_str на new_str start = text.find(old_str, start + new_str.length()); >std::cout 

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

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

std::string text ; text.replace(9, 6, 5, '*'); // Phone: +1*****8901

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

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

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

#include #include int main() < std::string text ; const std::string empty; text.replace(5, 4, empty); // Замена "Tom" на пустую строку std::cout 

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

#include #include int main() < std::string text ; text.erase(5, 4); // удаляем 4 символа с 5-го индекса std::cout 

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

#include #include int main() < std::string text ; std::string to_delete; // какую подстроку удалить size_t start ; // находим позицию подстроки while (start != std::string::npos) // находим и удаляем все вхождения to_delete < text.erase(start, to_delete.length()); start = text.find(to_delete, start + to_delete.length()); >std::cout 

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

std::string text ; text.erase(5); // удаляем все кроме первых 5 символов - остается "Hello"

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

std::string text ; text.erase(); // пустая строка

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

#include #include int main() < std::string text ; std::erase(text, 'T'); // Удаляем символ T std::cout 

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

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

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

vurdalak ★★★★★
19.12.10 15:42:07 MSK
1 2 →
anonymous
( 19.12.10 15:43:13 MSK )
Ответ на: комментарий от anonymous 19.12.10 15:43:13 MSK

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

vurdalak ★★★★★
( 19.12.10 15:44:15 MSK ) автор топика
Ответ на: комментарий от vurdalak 19.12.10 15:44:15 MSK

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

anonymous
( 19.12.10 15:46:36 MSK )
Ответ на: комментарий от anonymous 19.12.10 15:46:36 MSK

vurdalak ★★★★★
( 19.12.10 15:48:02 MSK ) автор топика
Ответ на: комментарий от vurdalak 19.12.10 15:44:15 MSK

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

Artificial_Thought ★★★★
( 19.12.10 15:48:58 MSK )
Ответ на: комментарий от Artificial_Thought 19.12.10 15:48:58 MSK

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

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

vurdalak ★★★★★
( 19.12.10 15:49:42 MSK ) автор топика
Ответ на: комментарий от vurdalak 19.12.10 15:49:42 MSK

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

Artificial_Thought ★★★★
( 19.12.10 15:50:28 MSK )

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

aho
( 19.12.10 15:50:44 MSK )
Ответ на: комментарий от vurdalak 19.12.10 15:48:02 MSK

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

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

anonymous
( 19.12.10 15:51:12 MSK )
Ответ на: комментарий от Artificial_Thought 19.12.10 15:50:28 MSK

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

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

vurdalak ★★★★★
( 19.12.10 15:51:23 MSK ) автор топика
Ответ на: комментарий от vurdalak 19.12.10 15:51:23 MSK

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

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

aho
( 19.12.10 15:52:15 MSK )
Ответ на: комментарий от Artificial_Thought 19.12.10 15:48:58 MSK

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

anonymous
( 19.12.10 15:53:00 MSK )

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

PoMbl4 ★
( 19.12.10 15:54:22 MSK )
Ответ на: комментарий от anonymous 19.12.10 15:53:00 MSK

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

Artificial_Thought ★★★★
( 19.12.10 15:55:43 MSK )
Ответ на: комментарий от PoMbl4 19.12.10 15:54:22 MSK

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

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

Fawkes
( 19.12.10 16:04:44 MSK )

str[strlen(str) - 1] = 0;

vurdalak ★★★★★
( 19.12.10 16:05:38 MSK ) автор топика
Ответ на: комментарий от Fawkes 19.12.10 16:04:44 MSK
Artificial_Thought ★★★★
( 19.12.10 16:07:13 MSK )
Ответ на: комментарий от vurdalak 19.12.10 16:05:38 MSK

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

Artificial_Thought ★★★★
( 19.12.10 16:07:49 MSK )
Ответ на: комментарий от Fawkes 19.12.10 16:04:44 MSK

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

PoMbl4 ★
( 19.12.10 16:08:34 MSK )
Ответ на: комментарий от Artificial_Thought 19.12.10 16:07:49 MSK

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

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

vurdalak ★★★★★
( 19.12.10 16:08:37 MSK ) автор топика
Ответ на: комментарий от vurdalak 19.12.10 16:08:37 MSK

if ( str[strlen(str)- 1] == '\n') str[strlen(str) - 1]='\0';

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

Dikar ★★
( 19.12.10 19:56:07 MSK )
Ответ на: комментарий от Dikar 19.12.10 19:56:07 MSK

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

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

vurdalak ★★★★★
( 19.12.10 20:00:43 MSK ) автор топика
Ответ на: комментарий от aho 19.12.10 15:50:44 MSK
anonymous
( 19.12.10 23:41:12 MSK )
Ответ на: комментарий от Dikar 19.12.10 19:56:07 MSK

>if ( str[strlen(str)- 1] == '\n') str[strlen(str) - 1]='\0';

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

Dimanc ★★
( 19.12.10 23:59:53 MSK )
Ответ на: комментарий от Dimanc 19.12.10 23:59:53 MSK

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

 int pos=strlen(str)- 1; if ( str[pos] == '\n') str[pos]='\0'; 

Dikar ★★
( 20.12.10 00:27:03 MSK )
Ответ на: комментарий от Dikar 20.12.10 00:27:03 MSK

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

Dimanc ★★
( 20.12.10 00:53:02 MSK )
Ответ на: комментарий от Dikar 20.12.10 00:27:03 MSK

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

for (char *c = str; *c? ((*c == '\n')? *c = '\0': 1): 0; ++c); 

Deleted
( 20.12.10 00:53:32 MSK )
Ответ на: комментарий от Dikar 20.12.10 00:27:03 MSK

char *p; . if(p = strchr(str, '\n')) *p =0; 

Eddy_Em ☆☆☆☆☆
( 20.12.10 00:53:46 MSK )
Ответ на: Вы всё ещё кипятите? Тогда мы идём к вам! от Deleted 20.12.10 00:53:32 MSK

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

Deleted
( 20.12.10 00:57:16 MSK )
Ответ на: комментарий от Dikar 20.12.10 00:27:03 MSK

> int pos=strlen(str)- 1;

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

int len = strlen(s); if(len > 0) if(s[len-1] == '\n') s[len-1] = 0; 

backbone ★★★★★
( 20.12.10 01:18:05 MSK )
Ответ на: комментарий от backbone 20.12.10 01:18:05 MSK

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

int len = strlen(s); if ((len > 0) && (s[len-1] == '\n')) s[len-1] = 0; 

Dimanc ★★
( 20.12.10 01:27:44 MSK )
Ответ на: комментарий от Dimanc 20.12.10 01:27:44 MSK

int len = strlen(s); if (len && (s[len-1] == '\n')) s[len-1] = 0; 

Dimanc ★★
( 20.12.10 01:29:02 MSK )
Ответ на: Вы всё ещё кипятите? Тогда мы идём к вам! от Deleted 20.12.10 00:53:32 MSK

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

for (char *c = str; *c? ((*c == '\n' && *(c+1) == '\0')? *c = '\0': 1): 0; ++c);

backbone ★★★★★
( 20.12.10 01:34:03 MSK )
Ответ на: комментарий от Dimanc 20.12.10 01:29:02 MSK

int len = strlen(s); if (len && (s[len-1] == '\n')) s[len-1] = 0;

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

backbone ★★★★★
( 20.12.10 01:36:09 MSK )
Ответ на: комментарий от backbone 20.12.10 01:34:03 MSK

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

Dikar ★★
( 20.12.10 01:57:12 MSK )
Ответ на: комментарий от backbone 20.12.10 01:36:09 MSK

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

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

Dimanc ★★
( 20.12.10 01:59:10 MSK )
Ответ на: комментарий от Dimanc 20.12.10 01:59:10 MSK

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

Dimanc ★★
( 20.12.10 02:01:18 MSK )
Ответ на: комментарий от Dimanc 20.12.10 01:59:10 MSK

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

Eddy_Em ☆☆☆☆☆
( 20.12.10 02:04:33 MSK )
Ответ на: Вы всё ещё кипятите? Тогда мы идём к вам! от Deleted 20.12.10 00:53:32 MSK

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

backbone ★★★★★
( 20.12.10 02:06:50 MSK )

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

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

Dimanc ★★
( 20.12.10 02:20:12 MSK )
Ответ на: комментарий от Dimanc 20.12.10 02:20:12 MSK

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

Dimanc ★★
( 20.12.10 02:20:53 MSK )
Ответ на: комментарий от Dimanc 20.12.10 02:20:12 MSK

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

int len = strlen(str); if (len ? (str[len-1] == '\n') : 0) str[len-1] = 0;

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

backbone ★★★★★
( 20.12.10 02:32:35 MSK )
Ответ на: комментарий от backbone 20.12.10 02:32:35 MSK

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

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

Dimanc ★★
( 20.12.10 02:37:45 MSK )
Ответ на: комментарий от backbone 20.12.10 02:32:35 MSK

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

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

rival ★★
( 20.12.10 02:42:10 MSK )
Ответ на: комментарий от rival 20.12.10 02:42:10 MSK

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

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

Dimanc ★★
( 20.12.10 02:42:56 MSK )
Ответ на: комментарий от Dimanc 20.12.10 02:42:56 MSK

Ну вот 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.)

Dimanc ★★
( 20.12.10 03:11:37 MSK )
Ответ на: комментарий от backbone 20.12.10 02:32:35 MSK

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

Удаление символа из строки в Python

Одной из распространенных задач при работе со строками в Python является удаление определенного символа из строки. Это может быть полезно во множестве ситуаций, например, при обработке текстовых данных или при создании пользовательского интерфейса.

Рассмотрим простой пример. Допустим, у нас есть строка «ПРИМЕР», и мы хотим удалить из нее средний символ, то есть «М».

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

Особенности строк в Python

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

Способы удаления символа из строки

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

Один из способов — это «сдвиг» всех символов влево, начиная с символа, который нужно удалить. Это можно сделать с помощью срезов строк. Например, если нужно удалить средний символ из строки, можно взять все символы до среднего и объединить их со всеми символами после среднего.

s = "ПРИМЕР" middle = len(s) // 2 new_s = s[:middle] + s[middle+1:]

В этом случае new_s будет строкой «ПРИЕР».

Другой способ — это создание новой строки и копирование в нее всех символов исходной строки, за исключением того, который нужно удалить. Это можно сделать с помощью цикла for и условного оператора.

s = "ПРИМЕР" new_s = "" for i in range(len(s)): if i != len(s) // 2: new_s += s[i]

Также new_s будет строкой «ПРИЕР».

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

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

s = "ПРИМЕР" new_s = s.replace("М", "", 1)

В этом случае new_s также будет строкой «ПРИЕР». Метод replace() заменяет первое вхождение подстроки на новую подстроку. В данном случае мы заменяем «М» на пустую строку, тем самым удаляя его из исходной строки.

TRIM - удаление символов с начала и конца строки

Если не передать второй параметр, то удаляются пробелы:

SELECT '#' || ltrim(' мама_мыла_раму') AS result > #мама_мыла_раму 

rtrim - удаляет символы с конца строки.

Работает аналогично ltrim , только символы удаляются с конца строки.

SELECT rtrim('мама_мыла_раму', 'муа') > мама_мыла_р 

btrim , или просто trim - удаляет символы с начала и конца строки.

Работает аналогично ltrim и rtrim , только символы удаляются с начала и конца строки.

SELECT trim('мама_мыла_раму', 'муа') > _мыла_р 

trim (из_какой_части какие_символы from откуда)

У trim есть еще одна форма записи:

trim (из_какой_части какие_символы from откуда) 

из_какой_части принимает одно из значений:

  • leading - с начала строки;
  • trailing - с конца строки;
  • both - с обеих сторон.

какие_символы - какие символы удалять. Порядок символов не важен. Регистр важен.

откуда - из какой строки удалять.

SELECT trim(both 'муа' from 'мама_мыла_раму') > _мыла_р 
SELECT trim(trailing 'муа' from 'мама_мыла_раму') > мама_мыла_р 

Практика TRIM - удаление символов с начала и конца строки

7.6 Дополнение до определенной длины

7.8 REPLACE - замена подстроки

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

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