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

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

  • автор:

Вставить символ в строку

Реализуйте в классе 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, если результат превышает максимально допустимое количество символов.

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

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