Вопрос задан 10.07.2026 в 10:14. Предмет Информатика. Спрашивает Aleshova Sveta.

1. Во многих языках (в том числе и в C++) можно использовать массивы символов, то есть массивы, каждый элемент которых – один символ. Чем отличается строка от массива символов? 2. Чем отличается действие оператора «+» для чисел и для символьных строк? 3. Как определить, что при поиске в строке образец не найден? 4. Как бы вы искали первый символ «с» с конца строки, если бы не было метода rfind?

Перейти к ответам

Ответы на вопрос

Отвечает Lion Beksultan.

  1. Строка и массив символов похожи, но это не одно и то же.

Массив символов — это набор ячеек типа char:

C++
char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

Он хранит отдельные символы. Чтобы такой массив воспринимался как текстовая строка в стиле C, в конце должен стоять специальный нулевой символ '\0'. Он показывает, где строка заканчивается.

Строка std::string — это специальный тип данных C++, предназначенный для работы с текстом:

C++
std::string s = "Hello";

Она сама хранит длину, умеет увеличиваться и уменьшаться, имеет методы find, rfind, substr, append и другие. Не нужно вручную следить за нулевым символом и размером массива.

Главные отличия:

  • массив имеет фиксированный размер;

  • у массива символов нет встроенных методов поиска, склеивания и т. д.;

  • std::string может менять длину;

  • std::string удобнее и безопаснее для обычной работы с текстом;

  • массив char может вообще не быть строкой, если в нём нет завершающего '\0'.

Например:

C++
char text[5] = {'H', 'e', 'l', 'l', 'o'};

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


  1. Для чисел оператор + выполняет сложение:

C++
int a = 2;
int b = 3;
int c = a + b; // 5

Для строк оператор + выполняет конкатенацию, то есть соединение текстов:

C++
std::string first = "Добрый";
std::string second = " день";

std::string result = first + second; // "Добрый день"

Важно не путать строки с отдельными символами. Например:

C++
char x = 'A';
char y = 'B';

int z = x + y;

Здесь произойдёт не склеивание "AB", а сложение числовых кодов символов.

Также нельзя просто складывать два строковых литерала:

C++
"Hello" + " world";   // ошибка

Нужно, чтобы хотя бы один операнд был объектом std::string:

C++
std::string result = std::string("Hello") + " world";

  1. При поиске с помощью метода find у объекта std::string образец считается не найденным, если результат равен std::string::npos.

C++
std::string text = "programming";

std::size_t pos = text.find("gram");

if (pos == std::string::npos) {
std::cout << "Образец не найден";
} else {
std::cout << "Найден с позиции " << pos;
}

std::string::npos — специальное значение, означающее «позиции не существует».

Нельзя надёжно проверять результат так:

C++
if (text.find("gram") == -1)

Хотя иногда это может сработать из-за преобразований типов, правильный и понятный вариант — сравнение именно с std::string::npos.


  1. Без rfind нужно просматривать строку справа налево и остановиться на первом подходящем символе. Это будет последнее вхождение символа в строке.

Для обычного однобайтного символа:

C++
std::string text = "абракадабра";
char target = 'a';

std::size_t pos = std::string::npos;

for (std::size_t i = text.size(); i-- > 0; ) {
if (text[i] == target) {
pos = i;
break;
}
}

if (pos != std::string::npos) {
std::cout << "Символ найден на позиции " << pos;
} else {
std::cout << "Символ не найден";
}

Цикл начинается с text.size(), а выражение i-- > 0 сначала уменьшает индекс перед обращением к элементу. Это важно, потому что std::size_t — беззнаковый тип: при попытке уменьшить ноль он переполнится.

Для русской буквы с есть особенность: в UTF-8 она обычно занимает несколько байтов, поэтому std::string работает не с символами Unicode, а с байтами. Для полноценной посимвольной обработки Unicode лучше использовать строку с широкими или Unicode-символами, например:

C++
std::u32string text = U"абракадабра";
char32_t target = U'с';

std::size_t pos = std::u32string::npos;

for (std::size_t i = text.size(); i-- > 0; ) {
if (text[i] == target) {
pos = i;
break;
}
}

Алгоритм остаётся тем же: идти от конца к началу, сравнивать символы и завершить поиск при первом совпадении.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос