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

Как добавить char в string c

Как добавить char в 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.

Строки в C++

Для работы со строкам в C++ используется тип string . В разделе про потоки мы уже создавали объекты типа string и использовали их с операторами > . Рассмотрим этот тип подробнее.

Примеры создания объектов string :

string a; // пустая строка string b("abc"); // строка проинициализирована списком символов string c1(b); // c1 является копией b string c2 = b; // c2 является копией b string d('d', 10); // d = "dddddddddd" 

Строки хранят в памяти последовательность объектов char , поэтому во многих случаях со строками можно работать как с массивом. Например, обращаться к символам через индекс.

string a("abz"); char c = a[2]; // 'z' char b = a.at(1); // 'b' a[2] = 'c'; // a = "abc" 

Механизмы обращения к элементу через оператор [] и с помощью метода at() отличаются. В первом случае не происходит проверки того, что индекс меньше, чем длина строки. Если это условие не выполняется, то мы приходим к ситуации неопределенного поведения. Метод at() выполняет эту проверку и генерирует исключение в случае некорректного индекса. За это более безопасное поведение мы платим процессорным временем для дополнительной проверки.

По символам строки можно пройти в цикле:

string s("abcde"); for (char ch : s)  cout  <ch  <' '; > 

Узнать длину строки можно с помощью метода size() .

Строки можно конкатенировать с помощью оператора + или метода append :

string a("Hello, "); string b("world!"); string c = a + b; // "Hello, world!" a.append(b); // a = "Hello, world!" a += b; // a = "Hello, world!world!" 

Добавить символ в конец строки можно с помощью метода push_back() , а удалить последний символ - с помощью метода pop_back() .

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

string line("There are two needles in this haystack with needles."); string query("needle"); size_t found = line.find(query); // found = 14 if (found != string::npos)  cout  <"first '"  <query  <"' found at: "  <found  <'\n'; > 

Метод find() возвращает позицию первого символа, которому соответствует совпадение. Если совпадений не найдено, возвращается специальная константа. size_t - это беззнаковый целочисленный тип.

Больше возможностей типа string можно найти в документации.

Документация

  • en.cppreference.com/w/cpp/string/basic_string
  • en.cppreference.com/w/cpp/header/cctype

String вставить символ

Вставить один символ в переменную типа string
Есть такая переменная string str = "Hllo world!"; Как мне вставить букву e, на первую позицию .

Как вставить элемент и вывести элементы на экран в map> ?
У меня есть map<string, map<string,int>>, в него надо добавить элементы (типа Ivanov potato 200).

Не могу вставить элемент в second(vector) мультимапа. multimap>
#include <iostream> #include <map> #include <vector> #include <algorithm> #include <string>.

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

205 / 181 / 112
Регистрация: 15.03.2014
Сообщений: 392

Лучший ответ

Сообщение было отмечено tupen_T_T как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#include using namespace std; int main() { string a = "bc"; a.insert(0, "z"); // кавычки двойные - вставим СТРОКУ "z" в позицию 0 cout  a  endl; a.insert( 0, 1,'a' ); // вставим 1 СИМВОЛ 'a', в позицию 0 a.insert( 0, 1, char(65) ); // вставим 1 СИМВОЛ 'A', в позицию 0 cout  a  endl; a.insert( 0, 5,'1' ); // вставим 5 СИМВОЛОВ '1', начиная с позиции 0 cout  a endl; return 0; }

22.6 – Добавление данных к объектам std::string

Добавить строку в конец существующей строки легко, для этого необходимо воспользоваться функцией operator+= , append() или push_back() .

string& string::operator+= (const string& str)
string& string::append (const string& str)

Эти функции добавляют к строке символы str .

  • Обе функции возвращают *this , поэтому их можно объединить в «цепочку».
  • Обе функции вызывают исключение length_error , если результат превышает максимальное количество символов.
string sString("one"); sString += string(" two"); string sThree(" three"); sString.append(sThree); cout 
one two three

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

string& string::append (const string& str, size_type index, size_type num)

Эта функция добавляет к строке num символов из строки str , начиная с index .

  • Возвращает *this , поэтому ее можно вставить в «цепочку».
  • Выбрасывает исключение out_of_range , если индекс выходит за пределы строки.
  • Выбрасывает исключение length_error , если результат превышает максимальное количество символов.
string sString("one "); const string sTemp("twothreefour"); // добавляем подстроку строки sTemp, начиная с индекса 3, длиной 5 sString.append(sTemp, 3, 5); cout 
one three

operator+= и append() также имеют версии, которые работают со строками в стиле C.

string& string::operator+= (const char* str)
string& string::append (const char* str)

Эти функции добавляют к строке символы str .

  • Обе функции возвращают *this , поэтому их можно объединить в «цепочку».
  • Обе функции вызывают исключение length_error , если результат превышает максимальное количество символов.
  • str не должна быть равна nullptr .
string sString("one"); sString += " two"; sString.append(" three"); cout 
one two three

Есть еще один дополнительный вариант append() , который работает со строками в стиле C:

string& string::append (const char* str, size_type len)

Добавляет в строку первые len символов строки str .

  • Возвращает *this , поэтому ее можно вставить в «цепочку».
  • Выбрасывает исключение length_error , если результат превышает максимальное количество символов.
  • Игнорирует специальные символы (включая " ).
string sString("one "); sString.append("threefour", 5); cout 
one three

Эта функция опасна, и ее использование не рекомендуется.

Также есть набор функций, которые добавляют символы. Обратите внимание, что имя неоператорной функции для добавления символа – push_back() , а не append() !

string& string::operator+= (char c)
void string::push_back (char c)

Эти функции добавляют к строке символ c .

  • operator+= возвращает *this , чтобы его можно было вставить в «цепочку».
  • Обе функции вызывают исключение length_error , если результат превышает максимальное количество символов.
string sString("one"); sString += ' '; sString.push_back('2'); cout 
one 2

Вам может быть интересно, почему имя этой функции – push_back() , а не append() . Это следует соглашению об именах, используемому для стеков, где push_back() – это функция, которая добавляет один элемент в конец стека. Если вы представляете строку, как стек символов, то для добавления одного символа в ее конец имеет смысл использовать push_back() . Однако, на мой взгляд, отсутствие функции append() выбивается из последовательности!

Оказывается, есть функция append() для символов, которая выглядит так:

string& string::append (size_type num, char c)

Добавляет количество вхождений символа c в строку

  • Возвращает *this , чтобы ее можно было вставить в «цепочку».
  • Выдает исключение length_error , если результат превышает максимальное количество символов.
string sString("aaa"); sString.append(4, 'b'); cout 
aaabbbb

Есть еще один, последний, вариант append() , который вы не поймете, если не знаете, что такое итераторы. Если вы не знакомы с итераторами, можете игнорировать эту функцию.

string& string::append (InputIterator start, InputIterator end)

Добавляет все символы из диапазона [ start , end ) (включая начало, но не включая конец)

  • Возвращает *this , чтобы ее можно было вставить в «цепочку».
  • Выдает исключение length_error , если результат превышает максимальное количество символов.

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

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