Вставить символ в строку
Реализуйте в классе String метод ввставки символа в произвольное место в строке: void ins(int, char).
В этой задаче введите строку с помощью класса String, введите символ и индекс, куда этот символ поставить и выведите измененную строку на экран.
Выводит invalid conversation from char to const char
Откуда и почему там должен быть const char и как тогда было бы правильно ?
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#include #include using namespace std; class String { int len; char *str; public: String(); String(const String&); String(char *str); ~String(); String& operator=(String &); friend ostream& operator(ostream &c, String &); String void_to_upper(String &); String void_to_lower(String &); char& operator[] (int index); void ins(int, char); }; void String::ins(int n, char x) { char tmp[100001]; strncpy(tmp, this->str, n - 1); strcat(tmp, x); strcat(tmp, this->str[n]); this->len++; this->str = tmp; return (*this); /*this->len++; this->str.insert(n, x); return (*this);*/ } String String::void_to_upper(String &x) { for (int i = 0; i x.len; i++) x[i] = toupper(x[i]); return (*this); } String String::void_to_lower(String &x) { for (int i = 0; i x.len; i++) x[i] = tolower(x[i]); return (*this); } istream &operator>>(istream &input, String &x) { char str[100001]; input.getline(str, 100001); String tmp(str); x = tmp; return input; } char& String::operator[] (int index){ return this->str[index]; }; ostream &operator(ostream &c, String &x) { c x.str; return c; } String::String(const String &x) { this->len = x.len; this->str = new char[this->len + 1]; strcpy(this->str, x.str); this->str[this->len] = '\0'; } String &String::operator=(String &x) { delete[] this->str; this->len = x.len; this->str = new char[this->len + 1]; strcpy(this->str, x.str); this->str[this->len] = '\0'; return (*this); } String::~String() { delete[] str; this->len = 0; } String::String() { this->str = new char[1]; this->len = 0; str[0] = '\0'; } String::String(char *str) { this->len = strlen(str); this->str = new char[this->len + 1]; strcpy(this->str, str); this->str[this->len] = '\0'; } int main() { String a; cin >> a; char s; int n; cin >> n >> s; a.ins(n, s); cout a; return 0; }
Строки в 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
Добавить символ(строку) в char*
Второе задание решил выполнять таким образом: Поместить в char dop первые num символов строки source, а потом с помощью конкатенации сложить dest и dop. Однако это не получается, так как появляется ошибка.
#include #include using namespace std; int str_len (char* s) < int x = 1; int len = 0; while(x) < if (s[len] == 0) else> return len; > char* str_n_cat(char* dest, char* source, unsigned int num) < int count = 0; char dop[num]; if (str_len(source) >= num) < while(count < num) < dop[count] = dop[count] + source[count]; count++; >dest = dest + dop; > > int main()
Урок №206. Вставка символов и строк в std::string
Вставлять символы/строки в std::string можно с помощью функции insert().
string& string::insert(size_type index, const string& str)
string& string::insert(size_type index, const char* str)
Обе функции вставляют символы/строки, начиная с определенного index std::string.
Генерируют исключение length_error, если результат превышает максимально допустимое количество символов.
Во второй версии функции insert() str не должен быть NULL .
std :: string sString ( «bbb» ) ;
std :: cout << sString << std :: endl ;
sString . insert ( 2 , std :: string ( "mmm" ) ) ;
std :: cout << sString << std :: endl ;
sString . insert ( 5 , "aaa" ) ;
std :: cout << sString << std :: endl ;
bbb
bbmmmb
bbmmmaaab
А вот версия функции insert(), которая позволяет вставить с определенного index std::string подстроку.
string& string::insert(size_type index, const string& str, size_type startindex, size_type num)
Эта функция вставляет с определенного index std::string указанное количество символов ( num ) строки str , начиная со startindex -а.
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Генерирует исключение out_of_range, если index или startindex некорректны.
Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.
std :: string sString ( «bbb» ) ;
const std :: string sInsert ( «012345» ) ;
sString . insert ( 1 , sInsert , 2 , 4 ) ; // вставляем подстроку sInsert длиной 4, начиная с символа под индексом 2, в строку sString, начиная с индекса 1
std :: cout << sString << std :: endl ;
А вот версия функции insert(), с помощью которой в std::string можно вставить часть строки C-style.
string& string::insert(size_type index, const char* str, size_type len)
Эта функция вставляет с определенного index std::string указанное количество символов ( len ) строки C-style str .
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Генерирует исключение out_of_range, если index некорректен.
Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.
Игнорирует специальные символы (такие как » ).
std :: string sString ( «bbb» ) ;
sString . insert ( 2 , «acdef» , 4 ) ;
std :: cout << sString << std :: endl ;
А вот версия функции insert(), которая вставляет в std::string один и тот же символ несколько раз.
string& string::insert(size_type index, size_type num, char c)
Эта функция вставляет с определенного index std::string указанное количество вхождений ( num ) символа c .
Возвращает скрытый указатель *this, что позволяет «связывать» объекты.
Генерирует исключение out_of_range, если index некорректен.
Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.
std :: string sString ( «bbb» ) ;
sString . insert ( 2 , 3 , ‘a’ ) ;
std :: cout << sString << std :: endl ;
И, наконец, функция insert() имеет три разные версии, которые работают с итераторами.
void insert(iterator it, size_type num, char c)
iterator string::insert(iterator it, char c)
void string::insert(iterator it, InputIterator begin, InputIterator end)
Первая версия функции вставляет в std::string указанное количество вхождений ( num ) символа c перед итератором it .
Вторая версия функции вставляет в std::string одиночный символ c перед итератором it и возвращает итератор в позицию вставленного символа.
Третья версия функции вставляет в std::string все символы диапазона (begin, end) перед итератором it .
Все функции генерируют исключение length_error, если результат превышает максимально допустимое количество символов.