Insert c что это
Перейти к содержимому

Insert c что это

  • автор:

Insert c что это

Здравствуйте. Пожалуйста, покажите мне простой пример программы, которая вставляет строку в строку в заданное место с помощью метода insert. Чтобы были функции и символьные строки, в общем, чтобы была часть не только main, но и объявления до main =) Простите, что говорю таким нелепым языком) Еще не очень ориентируюсь в C++)

GexogenSG1
Посмотреть профиль
Найти ещё сообщения от GexogenSG1

Регистрация: 16.12.2011
Сообщений: 2,329
Форумчанин
Регистрация: 07.04.2012
Сообщений: 216

// inserting into a string #include #include int main () < std::string str="to be question"; std::string str2="the "; std::string str3="or not to be"; std::string::iterator it; // used in the same order as described above: str.insert(6,str2); // to be (the )question str.insert(6,str3,3,4); // to be (not )the question str.insert(10,"that is cool",8); // to be not (that is )the question str.insert(10,"to be "); // to be not (to be )that is the question str.insert(15,1,':'); // to be not to be(:) that is the question it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question str.insert (str.end(),3,'.'); // to be, not to be: that is the question(. ) str.insert (it+2,str3.begin(),str3.begin()+3); // (or ) std::cout
RussDragon
Посмотреть профиль
Найти ещё сообщения от RussDragon

Пользователь
Регистрация: 16.06.2013
Сообщений: 18

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

GexogenSG1
Посмотреть профиль
Найти ещё сообщения от GexogenSG1

Пользователь
Регистрация: 16.06.2013
Сообщений: 18

и нужен самый простой вариант, а это, я так понимаю, не самый простой вариант. И такая программа легко ищется в гугле, я уже видел ее.

GexogenSG1
Посмотреть профиль
Найти ещё сообщения от GexogenSG1

Форумчанин
Регистрация: 07.04.2012
Сообщений: 216

Я вас не понимаю. str.insert(6,str2); — вставляем строку str2 с 6 символа. str2 может быть и строкой типа "String for example".

Последний раз редактировалось RussDragon; 22.06.2013 в 20:34 .

RussDragon
Посмотреть профиль
Найти ещё сообщения от RussDragon

МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,182

"нет, такой не пойдет." - почему?
"До main нет объявления функции символьных строк." - какой функции?
"Нет возможности указать место в строке, куда вставляется другая строка." - есть возможность.
"Необходимо именно две строки, и именно одну вставлять в другую и в именно мною указываемое место (по номеру символа, наверное)." - все так и есть.
"нужен самый простой вариант, а это, я так понимаю, не самый простой вариант" - это самый простой.
"И такая программа легко ищется в гугле, я уже видел ее." - так что же теперь каждый раз писать уникальный код?

Пишите язык программирования - это форум программистов , а не экстрасенсов. (<= это подпись ) Пользователь Регистрация: 16.06.2013 Сообщений: 18

Я понимаю, что вы меня не понимаете. Но вы понимаете, что мне нужно, чтобы я сам указывал куда вставить строку. Чтобы мне на экране в консоли выводился диалог, с 1 строкой и со второй строкой и чтобы указав номер символа первой строки, строка вставлялась именно после этого символа.
И нужно, чтобы не тупо тело программы было, а еще объявления функций (то есть то, что до сегмента main написано. Вы вообще не прочитали моих предыдущих постов.

GexogenSG1
Посмотреть профиль
Найти ещё сообщения от GexogenSG1

Как работает функция insert(то есть что надо отправлять что бы строка s вставлялась в строку s1)?

Есть конфигурация роутера, надо расписать что значит каждая строка
Помогите! есть конфигурация роутера, надо расписать что значит каждая стройка, и команды которыми.

Что выполняет эта строка: res.insert?
res.insert(res.begin(), ((Number >> i) & 0x01) + 48); Добавлено через 53 секунды мне не понятны.

Что есть что в задании? (что есть скрипт, а что - запрос, внутри)
"Создать модель сущность-связь. Написать скрипт создания таблицы в соответствии с этой моделью.

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

Лучший ответ

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

Решение

Думаю, из этого примера всё должно быть понятно.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// inserting into a string #include #include int main () { std::string str="to be question"; std::string str2="the "; std::string str3="or not to be"; std::string::iterator it; // used in the same order as described above: str.insert(6,str2); // to be (the )question str.insert(6,str3,3,4); // to be (not )the question str.insert(10,"that is cool",8); // to be not (that is )the question str.insert(10,"to be "); // to be not (to be )that is the question str.insert(15,1,':'); // to be not to be(:) that is the question it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question str.insert (str.end(),3,'.'); // to be, not to be: that is the question(. ) str.insert (it+2,str3.begin(),str3.begin()+3); // (or ) std::cout  str  '\n'; return 0; }

Вектора в С++ часть 5 (функции insert(), swap(), shrink_to_fit())

Вектора, позволяют помещать число в любую ячейку вектора (даже если эта ячейка уже занята), пример для понимания:

#include #include using namespace std; int main() < vector vecInt(3,100); ///Создаем вектор из 3 элементов и заполняем его значением 100 vector ::iterator it; it = vecInt.begin(); ///Итератор указывает на vec[0] ///Вектор расширяется теперь до 4 элементов vecInt.insert (it,200); ///И первым элементом записывается 200 ///Вектор расширяется теперь до 5 элементов it = vecInt.begin() + 3;///Вектор указывает на 4 элемент (0-элемент+3-элемента) vecInt.insert(it,300);///И четвертым элементом записывается 300 vecInt.insert(it+1,900);///Вектор расширяется теперь до 6 элементов и 5 элементом записывается 900 cout cout 

Работа нашей программы:

CppStudio.com
Vector contains: 200 100 100 300 900 100
Vector max_size: 1073741823
Vector size: 6 New vector size: 10

В 6 строке объявлен вектор размером из трех элементов типа int и сразу же заполнили его числом 100. В строке 7 мы объявляем итератор it , в 8 строке наш итератор указывает на нулевой элемент нашего вектора. В 11 строке мы встречаем новую функцию vector::insert() .

Функция vector::insert() принимает два аргумента (первый – указатель на ячейку вектора, куда будет помещено число, второй – само помещаемое число). Так как итератор it указывает на vecInt[0] , нулевой элемент вектора, то теперь vecInt[0]=200 . Длина вектора соответственно увеличивается на один элемент. В строке 14 итератор it теперь указывает на третий элемент вектора, т. е. vecInt[3] , соответственно назначение строки 15 становиться уже понятно.

В строке 16 число 900 мы записываем в позицию it+1 или vecInt[3+1] . В строках с 19-22 осуществляется вывод вектора, но это должно быть уже Вам понятно. В строке 24 используется функция vector::max_size() , которая выводит максимальный размер вектора, т. е. максимально возможное количество, элементов которое может вместить в себя вектор. В строке 26 встречается новая функция vector::resize () , функция позволяет увеличить размер вектора до заданной величины, в данном случае вектор расширяется до 10 элементов.

Если функция vector::resize() позволяет уменьшить размер вектора, то функция vector::reserve( ) имеет обратное действие, она позволяет расширить вектор до заданной величины, рассмотрим пример:

#include #include using namespace std; int main() < vector vecFirst ,vecSecond; /// Создаем два вектора for ( int i=0; i cout << "vecFirst contains: "; for (int i=0; iРабота нашей программы:

Функции insert()

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

#include #include #include #include using namespace std; int main()< setlocale(LC_ALL,""); string s1,s2,s3; cout>s1; cout>s2; s3="()"; s3.insert(1,s2); int size = s2.size(); int x = s1.find (s2); while (x cout

Отслеживать
задан 5 июл 2018 в 8:26
43 4 4 бронзовых знака

5 ответов 5

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

Если нужно найти все вхождения строки s2 в s1, то цикл здесь нужен. Проблема в том, что следующее вхождение нужно искать не с начала строки, как вы это делали здесь:

а с определённого индекса, то есть (предыдущий x + длина найденной строки)

x = s1.find(s2, x + s3.size());

int x = s1.find(s2); while (x != string::npos)

Отслеживать
ответ дан 5 июл 2018 в 9:12
Влада Мамутова Влада Мамутова
76 6 6 бронзовых знаков

Например, такая функция вернет вам то что нужно:

string& enclose(string& s1, const string& s2, const char ch1 = '(', const char ch2 = ')') < size_t first = s1.find(s2); if (first != string::npos) < auto p = s1.insert(s1.begin() + first, ch1); s1.insert(p + s2.size() + 1, ch2); >return s1; > 

Нет необходимости в дополнительном обьекте.

Отслеживать
ответ дан 5 июл 2018 в 8:53
AR Hovsepyan AR Hovsepyan
15.9k 3 3 золотых знака 13 13 серебряных знаков 30 30 бронзовых знаков
а если нет включения искомой строки? Ваша функция содержит серьезную ошибку
5 июл 2018 в 9:06

К тому же не думаю, что разумно использовать целочисленный тип для возвращаемого значения функции, которая использует отрицательное значение для сигнала об ошибке.

5 июл 2018 в 9:08

@Andrej Levkovitch, нетрудно найти во многих ответах неучтенные деталии и ставить минусы. А разве это делу поможет.

5 июл 2018 в 9:21

я поставил минус потому что в вашем ответе (была) не "неучтенный минус" - а серьезная ошибка, разве нет? Вы с этим не согласны? Но в любом случае, так как ошибка исправлена, мой минус я аннулирую

5 июл 2018 в 9:24

@Andrej Levkovitch, в таких случаях, для общего блага, любезно предупреждают об упущении. Но вы зря аннулировали минус, поскольку побольшому счету я должен был кинуть исключение, если строка не найдена, или как минимум, вывести сообщение на консоль.

5 июл 2018 в 9:32

Через метод find находим позицию начала строки s2 в строке s1. Если find не вернул std::string::npos , значит подстрока найдена, вставляем скобки методом insert .

#include #include int main()< std::string s1,s2; std::cout > s1; std::cout > s2; int pos = s1.find(s2); if(pos != std::string::npos) < s1.insert(pos, "("); s1.insert(pos+s2.length()+1, ")"); std::cout else std::cout

first string: foobar

second string: bar

Sucess!

foo(bar)

Отслеживать
ответ дан 5 июл 2018 в 9:12
Alexshev92 Alexshev92
3,125 6 6 золотых знаков 18 18 серебряных знаков 33 33 бронзовых знака

Ну так а что вы делаете сдесь:

int x = s1.find (s2); while (x

? У вас всегда условие в цикле будет верным!! Так как если искомая строка есть в s1 , то x , конечно, будет меньше size . А если нет, то x будет равен -1 , и тоже меньше чем size .

И зачем вам сдесь вообще цикл? Разве не достаточно простого if ?

int x = s1.find (s2); if (x != -1)

Так все работает.

Отслеживать
ответ дан 5 июл 2018 в 8:53
Andrej Levkovitch Andrej Levkovitch
8,027 2 2 золотых знака 19 19 серебряных знаков 45 45 бронзовых знаков

 int x = s1.find (s2); while (x

при осутствии find возвращает std::string::npos == -1 , то есть в любом случае бесконечный цикл. Баг в алгоритме ещё, вы в переменной s1 не удаляете найденную строку, а делаете replace , при s1 == s2 будет опять зависон. Демонстрация этой проблемы:

# include # include int main() < std::string s1("abc"); std::string s2("a"); int size = s2.size(); std::string s3("aa"); int x = std::string::npos ; if (x == -1) std::coutif(not limit) std::cout
std::string::npos == -1 s1=aabc s1=aaabc s1=aaaabc s1=aaaaabc s1=aaaaaabc s1=aaaaaaabc s1=aaaaaaaabc s1=aaaaaaaaabc s1=aaaaaaaaaabc s1=aaaaaaaaaaabc Zavison! 

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

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