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

Как удалить string c

  • автор:

Как удалить string c

Здравствуйте, Аноним, Вы писали:

А>Как удалить последний символ из std::string?
К примеру так,

if (!s.empty()) s.erase( s.end() - 1 );

С уважением, Александр
Re: Удаление из std::string

От: achp
Дата: 02.08.07 15:52
Оценка: +1

Здравствуйте, Аноним, Вы писали:

А>Как удалить последний символ из std::string?

s.resize(s.size() - 1);

Re[2]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 10:16
Оценка:

Здравствуйте, Smal, Вы писали:

S>Здравствуйте, Аноним, Вы писали:

А>>Как удалить последний символ из std::string?
S>К примеру так,

S>

S>if (!s.empty()) S> s.erase( s.end() - 1 ); S>
S>if (!s.empty()) S> s.erase( s.rbegin() ); S>

Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[3]: Удаление из std::string

От: Bell
Дата: 03.08.07 11:11
Оценка: +1

Здравствуйте, dr.Chaos, Вы писали:

DC>Тогда может?

S>>

S>>if (!s.empty()) S>> s.erase( s.rbegin() ); S>>

Не существует перегрузки erase для reverse_iterator.

Любите книгу — источник знаний (с) М.Горький
Re[4]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 11:30
Оценка:

Здравствуйте, Bell, Вы писали:

B>Здравствуйте, dr.Chaos, Вы писали:

DC>>Тогда может?

S>>>

S>>>if (!s.empty()) S>>> s.erase( s.rbegin() ); S>>>

B>Не существует перегрузки erase для reverse_iterator.

Мда, не существует. Посыпаю голову пеплом.

if (!s.empty()) s.erase( s.rbegin().base() );

Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[5]: Удаление из std::string

От: Bell
Дата: 03.08.07 11:39
Оценка:

Здравствуйте, dr.Chaos, Вы писали:

DC>Мда, не существует. Посыпаю голову пеплом.
Ну, не стоит так уж себя казнить

DC>Тогда так :
DC>

DC>if (!s.empty()) DC> s.erase( s.rbegin().base() ); DC>
assert(s.end() == s.rbegin().base());

Любите книгу — источник знаний (с) М.Горький
Re[6]: Удаление из std::string

От: sof.bix http://byterix.net
Дата: 03.08.07 13:06
Оценка:

B>Опять мимо
B>

B>assert(s.end() == s.rbegin().base()); B>
if (!s.empty()) s.erase( (s.rbegin() - 1).base() - 1) );

Re[6]: Удаление из std::string

От: sof.bix http://byterix.net
Дата: 03.08.07 13:11
Оценка:

Здравствуйте, Bell, Вы писали:

B>Опять мимо
B>

B>assert(s.end() == s.rbegin().base()); B>
if (!s.empty()) s.erase( s.rbegin().base() - 1 );

А вообще конец рабочей недели

Re[7]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 13:17
Оценка: +1

Здравствуйте, sof.bix, Вы писали:

SB>Он имел в виду:

SB>

SB>if (!s.empty()) SB> s.erase( s.rbegin().base() - 1 ); SB>

SB>А вообще конец рабочей недели

Нет уж позвольте, я имел ввиду именно то, что написал.

Просто в данном раскладе все равно вычитание надо, от которого я хотел избавится. А вообще erase для reverse_iterator сделать не трудно, но видимо народ решил не парится, т.к. вроде не нужно, хотя это могло бы уменьшить количество потенциальных ошибок, при приведении от reverse_iterator к iterator особенно на границах .

Удаление определенных символов из строки

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

Отслеживать
51.6k 199 199 золотых знаков 59 59 серебряных знаков 242 242 бронзовых знака
задан 10 июл 2020 в 18:22
Александр II Александр II
95 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

эффективнее решить задачу можно с использованием идиомы erase-remove:

 std::string a = "agaga"; a.erase(std::remove(a.begin(), a.end(), 'a'), a.end()); std::cout  

обьяснение: remove смещает элементы не равные 'a' в начало строки в том же порядке в каком они были изначально, потом возвращает итератор на первый элемент равный 'a' (эти элементы лежат в хвосте строки), и затем erase затирает ненужные элементы от начала этого итератора и до конца

Как удалить string c

Если надо добавить в конец строки другую строку, применяется метод 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.

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

Удаление символа из строки
всем привет как можно удалить символ из строки? посоветовали воспользоваться ф-ей memmove, но я.

Удаление символа строки
Здравствуйте а есть такая функция которая удаляет из строки выбранный символ и соответственно.

Удаление символа из строки
Подскажите пожалуйста где я затупил ) Программа уделяет нужный символ, но после этого дописывает.

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

146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
Сдвинуть все последующие символы назад.

Эксперт С++

2890 / 1825 / 356
Регистрация: 09.09.2010
Сообщений: 3,841

1 2 3 4
std::string str("some text()"); std::cout  str  '\n'; str.erase(str.find('('), 1); std::cout  str;

403 / 359 / 36
Регистрация: 11.10.2010
Сообщений: 1,907

ЦитатаСообщение от . DIMA. Посмотреть сообщение

Сдвинуть все последующие символы назад.
Почему? Можно так удалить

string s; // строка s.erase(i,1); // удаляет из строки символ с индексом i

2684 / 1942 / 968
Регистрация: 21.12.2010
Сообщений: 3,614
Записей в блоге: 9

1 2 3 4 5 6 7 8 9 10
#include #include #include using namespace std; int main(){ string s="(sss(fff(ggg", s1; remove_copy(s.begin(), s.end(), back_inserter(s1), '('); couts1; }

403 / 359 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
igorrr37, что такое s1, и почему так сложно.

Эксперт С++

5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448

milke, если пишешь в С++ с std::string, то можно воспользоваться методом erase. Если в С с обычным массивом char, то нужно либо сдвигать все символы правее удаляемого на один символ влево, либо копировать все символы, кроме удаляемого, в новую строку

Добавлено через 41 секунду

ЦитатаСообщение от aram_gyumri Посмотреть сообщение

igorrr37, что такое s1, и почему так сложно.
s1 - это объявленный пользователем объект типа std::string
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782

ЦитатаСообщение от aram_gyumri Посмотреть сообщение

Почему? Можно так удалить
А если без string?
2684 / 1942 / 968
Регистрация: 21.12.2010
Сообщений: 3,614
Записей в блоге: 9

1 2 3 4 5 6 7 8 9 10 11 12
#include using namespace std; int main(){ char c[]="((sss(((fffggg(("; char d[sizeof(c)]; for(char* a=c, *b=d; *a; ++a, ++b){ while(*a=='(') ++a; *b=*a; } coutd; }

Регистрация: 12.01.2011
Сообщений: 14

ЦитатаСообщение от Nameless One Посмотреть сообщение

milke, если пишешь в С++ с std::string, то можно воспользоваться методом erase. Если в С с обычным массивом char, то нужно либо сдвигать все символы правее удаляемого на один символ влево, либо копировать все символы, кроме удаляемого, в новую строку

Добавлено через 41 секунду

s1 - это объявленный пользователем объект типа std::string

А как перенести все символы в новую строку кроме удаляемого?

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
milke, remove_copy. Сообщение номер 5.

Эксперт С++

5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448

ЦитатаСообщение от milke Посмотреть сообщение

А как перенести все символы в новую строку кроме удаляемого?
На сишке - так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#include #include #define SIZE 80 typedef int (*Pred)(char); char* copyIf(char* dest, const char* src, Pred p); int commasFree(char c); int main() { char str1[SIZE], str2[SIZE]; puts("Input a line:"); fgets(str1, SIZE, stdin); copyIf(str2, str1, commasFree); puts("The line without commas:"); fputs(str2, stdout); exit(0); } char* copyIf(char* dest, const char* src, Pred p) { while(*src) { if(p(*src)) *dest++ = *src; ++src; } *dest = '\0'; return dest; } int commasFree(char c) { return c != ','; }

Регистрация: 09.08.2011
Сообщений: 4
Скажите пожалуйста, а как удалить символ "\" и символ переноса на след строку?

Эксперт С++

5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448

ЦитатаСообщение от Fra Dolcino Посмотреть сообщение

Скажите пожалуйста, а как удалить символ "\" и символ переноса на след строку?

1 2 3 4 5 6 7
int skip_NL_and_backslash(char c) { return strchr("\n\r\\", c) == NULL; } // . copyIf(str2, str2, skip_NL_and_backslash);

Регистрация: 09.08.2011
Сообщений: 4

Не понял немного. Пишу на с++. У меня задача: есть файл, в котором записаны строки из цифр и в конце каждой строки стоит символ '\'. Нужно удалить '\' и соединить все строки в одну, без символа перехода на новую строку.
Удаление '\' я сделал:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include #include using namespace std; int main() { ifstream fin("filename.txt"); string s; vector string> file; while (getline(fin, s)) { s.erase(s.find('\\'), 1); file.push_back(s); } fin.close(); ofstream fout("filename.txt"); for (int i = 0; i  file.size(); i++) { fout  [i]  ; } return 0; }

А как сделать соединение в одну? Или удаление символа перехода на новую?!

Эксперт С++

5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
Fra Dolcino, мой вариант на Си:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#include #include #include #define SIZE 80 typedef int (*Pred)(char); char* copyIf(char* dest, const char* src, Pred p); int skip_NL_and_backslash(char); int main(int argc, char* argv[]) { FILE* src; FILE* dst; char src_buf[SIZE]; char dst_buf[SIZE]; if(argc != 3) fprintf(stderr, "Usage: %s SOURCE DEST\n", *argv), exit(1); if((src = fopen(argv[1], "r")) == NULL) perror(argv[1]), exit(1); if((dst = fopen(argv[2], "w")) == NULL) perror(argv[2]), exit(1); while(fgets(src_buf, SIZE, src)) { copyIf(dst_buf, src_buf, skip_NL_and_backslash); if(fputs(dst_buf, dst) == EOF) perror(argv[2]), exit(1); } if(ferror(src)) perror(argv[1]), exit(1); fclose(src); fclose(dst); exit(0); } char* copyIf(char* dest, const char* src, Pred p) { char* start = dest; while(*src) { if(p(*src)) *dest++ = *src; ++src; } *dest = '\0'; return start; } int skip_NL_and_backslash(char c) { return strchr("\n\r\\", c) == NULL; }

Пример использования:

[nameless@desktop c]$ cat test.txt \foo bar\ baaz quuz [nameless@desktop c]$ ./sample test.txt output.txt && cat output.txt foobar baazquuz[nameless@desktop c]$

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

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