1. Во многих языках (в том числе и в C++) можно использовать массивы символов, то есть массивы, каждый элемент которых – один символ. Чем отличается строка от массива символов? 2. Чем отличается действие оператора «+» для чисел и для символьных строк? 3. Как определить, что при поиске в строке образец не найден? 4. Как бы вы искали первый символ «с» с конца строки, если бы не было метода rfind?
Ответы на вопрос
-
Строка и массив символов похожи, но это не одно и то же.
Массив символов — это набор ячеек типа 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-строка: функция вывода строк не знает, где остановиться.
-
Для чисел оператор
+выполняет сложение:
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";
-
При поиске с помощью метода
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.
-
Без
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;
}
}
Алгоритм остаётся тем же: идти от конца к началу, сравнивать символы и завершить поиск при первом совпадении.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

