Строки в языке C++

В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.

Строки в C++ могут быть разделены на C-строки и C++-строки, где к первым относятся различные вариации char*, а ко вторым относятся вариации std::basic_string<…>. В рамках данного цикла мы будем рассматривать только C++-строки так как C-строки, по большей части, существуют как наследие C и самостоятельного интереса не представляют.

In [1]:
#include <string>

#include <iostream>
#include <algorithm>
using namespace std;

Строки можно объявлять и одновременно присваивать им значения. Для инициализации строк можно использовать различные способы.

Конструкторы строк

string() - конструктор по умолчанию (без параметров) создает пустую строку.

string(string & str) - копия строки str

string(size_t n, char c) - повторение символа c заданное число n раз.

string(size_t c) - строка из одного символа c.

string(string & str, size_t start, size_t len) - строка, содержащая не более, чем len символов данной строки str, начиная с символа номер start.

In [2]:
{
    std::string str1, str2 = "Hello";

    std::string str3("Hello3"); 
    std::string str4(5, 'H'); 
    std::string str5 = str3;
    str5 += "_test";
    
    std::cout << "Тест:" << std::endl;
    
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    std::cout << str3 << std::endl;
    std::cout << str4 << std::endl;
    std::cout << str5 << std::endl;
}
Тест:

Hello
Hello3
HHHHH
Hello3_test

Строка str1 будет пустой, строка str2 будет состоять из 5 символов.

К отдельным символам строки можно обращаться по индексу, как к элементам массива. Например str[0] - это первый символ строки.

Для того, чтобы узнать длину строки можно использовать метод size() строки. Например, последний символ строки str это str[str.size() - 1]. Подробнее расмотрим ниже.

In [3]:
{
    std::string str("Hello");
    std::cout << str[str.size() - 1];
}
o

Ввод/вывод строк

Строки можно выводить с помощью cout:

In [4]:
{
    std::string str("Hello");
    std::cout << str;
}
Hello

Для считывания строки можно использовать операцию >> для объекта cin:

In [5]:
{
    std::string str;
    std::cin >> str; 
    std::cout << str;
}
srti
srti

Арифметические операторы

Со строками можно выполнять следующие арифметические операции:
= - присваивание значения.
+= - добавление в конец строки другой строки или символа.
+ - конкатенация двух строк, конкатенация строки и символа.
==, != - посимвольное сравнение.
<, >, <=, >= - лексикографическое сравнение.

In [6]:
{
    std::string str("H");
    std::string str1;
    str1 = str; 
    std::cout << str1 << std::endl;
    str1 += "e";
    std::cout << str1 << std::endl;
    std::cout << str1 + str << std::endl;
}
H
He
HeH

size

Метод size() возращает длину длину строки. Возвращаемое значение является беззнаковым типом (как и во всех случаях, когда функция возращает значение, равное длине строке или индексу элемента - эти значения беззнаковые). Поэтому нужно аккуратно выполнять операцию вычитания из значения, которое возвращает size(). Например, ошибочным будет запись цикла, перебирающего все символы строки, кроме последнего, в виде for (int i = 0; i < S.size() - 1; ++i).

Кроме того, у строк есть метод length(), который также возвращает длину строки.

Подробней о методе size.

In [7]:
{
    std::string str("Hello");
    std::cout << str.size() << " " << str.length();
}
5 5

resize

str.resize(n) - Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде str.resize(n, c), где c - символ, то при увеличении длины строки добавляемые символы будут равны c.

Подробней о методе resize.

In [8]:
{
    std::string str("Hello");
    str += 'c';
    str.resize(3);
    std::cout << str << std::endl;
    str.resize(5, 'H');
    str += 'c';
    std::cout << str << std::endl;
}
Hel
HelHHc

clear

str.clear() - очищает строчку, строка становится пустой.

Подробней о методе clear.

In [9]:
{
    std::string str("Hello");
    str.clear();
    std::cout << str << std::endl;
}

empty

str.empty() - возвращает true, если строка пуста, false - если непуста.

Подробней о методе empty.

In [10]:
{
    std::string str("Hello");
    std::string str1;
    std::cout << std::boolalpha;
    std::cout << str.empty() << std::endl;
    std::cout << str1.empty() << std::endl;
}
false
true

push_back

str.push_back(c) - добавляет в конец строки символ c, вызывается с одним параметром типа char.

Подробней о методе push_back.

In [11]:
{
    std::string str("Hello");
    str.push_back('H');
    std::cout << str << std::endl;
}
HelloH

append

Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова.

Подробней о методе append.

In [22]:
{
    std::string str("Hello");
    std::string str1("Word");
    str.append(str1);
    std::cout << str << std::endl;
    str.append("P", 0, 7);
    std::cout << str << std::endl;
}
HelloWord
HelloWordP

erase

str.erase(pos) - удаляет из строки str. с символа с индексом pos и до конца строки.

str.erase(pos, count) - удаляет из строки str с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().

Подробней о методе erase.

In [13]:
{
    std::string str("Hello");
    std::string str1("Word_help");
    str.erase();
    std::cout << str << std::endl;
    str1.erase(8);
    std::cout << str1 << std::endl;
    str1.erase(1, 2);
    std::cout << str1 << std::endl;
}
Word_hel
Wd_hel

insert

Вставляет в середину строки несколько символов, другую строку или фрагмент другой строки.

Подробней о методе insert.

In [14]:
{
    std::string str = "Hello";
    std::string str1 = "Word_help";

    str1.insert(4, "H");
    std::cout << str1 << std::endl;
    str1.insert(4, str);
    std::cout << str1 << std::endl;
}
WordH_help
WordHelloH_help

substr

str.substr(pos) - возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки.

str.substr(pos, count) - возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > str.size().

Подробней о методе substr.

In [15]:
{
    std::string str1 = "Word_help";
    std::cout << str1.substr(4) << std::endl;
    std::cout << str1.substr(2, 3) << std::endl;
}
_help
rd_

replace

Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки.

Подробней о методе replace.

In [16]:
{
    std::string str = "Hello";
    std::string str1 = "Word_help";
    str1.replace(0, 5, str);
    std::cout << str1 << std::endl;
}
Hellohelp

find

Ищет в данной строке первое вхождение другой строки str. Возвращается номер первого символа, начиная с которого далее идет подстрока, равная строке str. Если эта строка не найдена, то возвращается константа string::npos (которая равна -1, но при этом является без знаковой, то есть на самом деле является большим без знаковым положительным числом).

Если задано значение pos, то поиск начинается с позиции pos, то есть возвращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 - поиск осуществляется с начала строки.

Подробней о методе find.

In [17]:
{
    string str = "Hello world Help"; 
    size_t found = str.find("world"); 
    if (found != string::npos) 
        cout << found << endl;    
}
6

rfind

Ищет последнее вхождение подстроки ("правый" поиск). Способы вызова аналогичны способам вызова метода find.

Подробней о методе rfind.

c_str

Возвращает указать на область памяти, в которой хранятся символы строки, возвращает значение типа char*. Возвращаемое значение можно рассматривать как C-строку и использовать в функциях, которые должны получать на вход C-строку.

Подробней о методе c_str.

Задачи.

Пусть задан некоторый текст. Вычислить, сколько раз повторяется наперед заданный символ a

In [18]:
{
    // нахождение числа вхождений символа в строке
    std::string str; // строка символов
    char a; // заданный символ
    int i;
    int k; // результат - число вхождений символа a в строке S

    // ввод строки S
    std::cin >> str; 

    // ввод символа a
    std::cin >> a; 


    k = 0; // в начале обнулить счетчик k
    for (i=0; i < str.size(); i++)
        if (str[i] == a)
            k++; // увеличить счетчик на 1  
     std::cout << k;
}
qwertyaanmnmamam
a
4

Вводиться строка, необходимо вывести на экран все слова нечетной длинны, в которых не содержится повторяющихся букв.

In [19]:
bool isValidWord( std::string word )
{
   if ( word.length() % 2 == 1 )
   {
      bool isBreaked = false;
      for ( size_t i = 0; i < word.length(); ++i )
      {
         if ( word.rfind( word.at(i) ) != i )
         {
            isBreaked = true;
            break;
         }
      }
 
      if ( isBreaked )
         return false;
      else
         return true;
   }
   else
      return false;
}
In [20]:
{
   std::string text; // строка для ввода пользователем
   std::string word; // текущее слово
   const char *delimeters = " .,;:?!"; // символы разделяющие слова
   size_t prevPos = 0; // предыдущая позиция поиска
   size_t curPos = 0; // текущая позиция поиска
 
   std::getline( std::cin, text );
 
   curPos = text.find_first_of( delimeters );
   while ( curPos != std::string::npos )
   {
      word = text.substr( prevPos, curPos - prevPos );
      if ( isValidWord( word ) )
         std::cout << word << std::endl;
 
      prevPos = curPos + 1;
      curPos = text.find_first_of( delimeters, curPos + 1 );
   }
   word = text.substr( prevPos, text.length() - prevPos ); // обработка последнего слова
   if ( isValidWord( word ) )
      std::cout << word << std::endl;
}
aaddd qwert asdfgh azxc
qwert
In [ ]: