Символы и строки
Символы
ASCII стандарт
American Standard Code for Information Interchange (ASCII)
American Standard Code for Information Interchange (ASCII)
ANSI кодировка
Windows 1251
Windows 1251
Unicode
Символы
Char
char
char
C-style строки
Что такое char массив?
Работа с массивом char
Работа с массивом char
Работа с массивом char
Ввод символьных массивов с консоли
Изменение символов
Функции для char массивов
Длина строки
Отличие strlen и size
Копирование
Поиск
Объединение строк
Строковые функции из C
Функции строк
Регистр символов
Класс std::string
Создание и инициализация строк
Обращение к символам строки
Перебор всех символов
Ввод строк с клавиатуры
Методы работы со строками
Задача
Арифметические операторы
Сложение строк
Метод append()
Метод resize
Сравнение строк
Сравнение строк
Сравнение строк
Задача на сравнение
Метод compare()
Вариации использования compare
Пример
Получение подстроки
Получение подстроки
Проверка начала строки
Проверка конца строки
Поиск подстроки
Поиск подстроки
Поиск подстроки
Поиск в обратном порядке
Поиск любого из набора символов
Поиск любого из набора символов
Задача
Вставка строки
Вставка строки
Вставка строки
Замена подстроки
Замена подстроки и удаление
Удаление символов
Удаление символов
Удаление всех вхождений определенной подстроки
Вариации erase
erase в С++20
Задача
Добавление символа в конец строки и удаление
Функции для работы с символами
Пример 1
Пример 2
Пример 2
Преобразование в строку
Функции преобразования из строки в число
Работа с русским языком
Пример
Задача
istringstream и ostringstream
std::istringstream — Поток ввода (чтение)
std::ostringstream — Поток вывода (запись)
std::stringstream
Метод str()
Чтение из потока (извлечение строки)
Запись в поток (установка новой строки)
Сброс и очистка
Сброс и очистка
Разбор задач
Конвертация типов
Задача
Разбор задачи
4.98M
Категория: ПрограммированиеПрограммирование

15_C++_Строки

1. Символы и строки

ИНСТИТУТ СРЕДНЕГО
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
Символы и строки
Основы алгоритмизации и
программирования
© К. Поляков, 2006-2012
http://kpolyakov.narod.ru

2. Символы

2
Символ – элементарная единица, некоторый набор которых несет определенный
смысл.
В С++ предусмотрено использование символьных констант.
Символьная константа – это целочисленное значение (типа int) представленное в
виде символа, заключённого в одинарные кавычки, например ‘a’.
Мы видим
Компилятор видит

3. ASCII стандарт

ASCII — стандарт кодирования букв латинского алфавита, цифр, некоторых
специальных знаков и управляющих символов, принятый в 1963 году Американской
ассоциацией стандартов.
ASCII представляет собой набор из 128 кодов символов, каждому из которых
соответствует 7-битовое двоичное число.
27=128
Учитывая, что каждый бит принимает значение 0
или 1, получаем, что с помощью 1 байта можно
закодировать 128 различных символов и их хватит
на их алфавит, цифры и спец.символы.

4. American Standard Code for Information Interchange (ASCII)

4

5. American Standard Code for Information Interchange (ASCII)

Символы с кодами 48-57
соответствуют
начертанию
Знаки препинания, знаки для
арабских цифр.
и
биржевых
Символы с кодами, меньшими финансовых
32
это
специальные операций (#, $, %, &, @), скобки,
Символы с кодами 65-90 математические символы и т.д.
управляющие символы.
заглавные буквы латинского
алфавита.
А символы с 97-122 строчные
буквы латинского алфавита.
5

6. ANSI кодировка

6
1 cимвол = 1 байт = 8 бит
28=256
Кодировка ANSI — это 8-битный стандарт представления символов (до 256 знаков),
где реальная кодировка зависит от региональных настроек (для русского языка —
Windows-1251).
Содержит неизмененную 7-битную таблицу ASCII, расширяя её до 8 бит (128–255
символов) для поддержки национальных алфавитов.

7.

7
диакритические знаки, псевдографику
(рамки, стрелки) и т.д.

8. Windows 1251

8
Windows-1251 (кириллическая кодировка) расширяет ANCI для поддержки русских
символов.
Диапазон с 128 по 255 содержит расширенные символы, включая кириллические
буквы.
Подключаем библиотеку <windows.h>
Затем используем функции
SetConsoleOutputCP(1251)
SetConsoleCP(1251)
или (менее предпочтительный вариант)
system(“chcp 1251>nul”);

9. Windows 1251

128–191 - дополнительные символы (знаки валюты, граф.
символы).
192–223 - Русские заглавные буквы А-Я.
224–255 - Русские строчные буквы а-я.

10. Unicode

10
Unicode (Юникод) — то всемирный стандарт, который присваивает уникальный
числовой код каждому символу (букве, цифре, знаку, эмодзи) практически всех
языков мира. Он позволяет компьютерам отображать тексты на разных языках
одновременно без ошибок и нечитаемых символов, заменяя собой множество
старых, несовместимых друг с другом кодировок.
Юникод содержит более 150 тысяч символов: кириллицу, латиницу, иероглифы,
математические знаки и смайлики.
Каждый символ имеет свой «код» (например, «A» — U+0041), который одинаков во
всех операционных системах.

11. Символы

© К. Поляков, 2006-2012
http://kpolyakov.narod.ru

12. Char

12
char представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может
хранить любое значение из диапазона от -128 до 127, либо от 0 до 255 (если он unsigned).
В качестве значения переменная типа char может принимать один символ в одинарных
кавычках, либо числовой код символа:
Эквивалентные записи

13. char

13
Как и целые числа, данные типа char можно складывать, вычитать, умножать и даже
делить. Но если операции умножения и деления, как правило, бессмысленны, то
сложение и вычитание вполне осмысленно. Например:
запись 'A' будет соответствовать
символу A или ASCII коду 65
Как вывести на экран ASCII код?
Нужно преобразовать значение величины типа char к
значению типа int. Например:

14. char

14
Организовать последовательное посимвольное считывание всего входного потока
можно при помощи цикла while:
Для того, чтобы сообщить программе о завершении
входного потока при вводе с клавиатуры необходимо
нажать клавиши
Ctrl-d
Ctrl-z
в системе Linux и
в системе Windows.

15.

Массивы символов
(или строки C-style)
© К. Поляков, 2006-2012
http://kpolyakov.narod.ru

16. C-style строки

16
Текстовая строка - это последовательность символов. Поскольку символы в строке пронумерованы,
то представлением для строки является массив символов.
В языке C строкой считался массив символов, а для обозначения конца строки использовался
символ с ASCII-кодом 0 ( \0 ), это позволяло хранить строки разной длины (то есть в массиве char[n]
можно было хранить строки любой длины, не превосходящей n-1).
Неудобства: любая строка ограничена по длине размером массива, а чтобы вычислить длину
строки необходимо пройти по всей строке до появления нулевого символа.
\
\

17. Что такое char массив?

17
Массив символов в C++ — это последовательность символов, хранящихся в памяти, и
завершающаяся нуль-терминатором ('\0'). Этот нуль-терминатор указывает на конец строки.
Нуль-терминатор, или символ конца строки, — это специальный символ, используемый в языке
программирования C и его производных, таких как C++. Он представляет собой знак '\0', который
сообщает окончание строки символов.
Основное преимущество массивов символов заключается в том, что они являются низкоуровневым
представлением строк, что позволяет более точно управлять памятью и производительностью.

18. Работа с массивом char

18
При инициализации мы можем передать символьному массиву как набор символов, так и строку:
Казалось бы оба массива имеют один и тот же набор символов, пусть в первом случае это просто
набор отдельных символов, а во втором - строка.
Но в первом случае - массив hello1 будет иметь пять элементов. А во втором случае массив hello2
будет иметь не 5 элементов, а 6, поскольку при инициализации строкой в символьный массив
автоматически добавляется нулевой символ '\0'.

19. Работа с массивом char

19
Способ определения символьного массива влияет на работу с ним.
Так, при выводе на консоль оператор cout отобразит всю строку до символа '\0'. В конце обязательно
должен быть символ '\0', иначе на консоль будут выводится символы из последовательных ячеек
памяти, которые содержат мусор, пока не встретится либо нулевой символ, либо не произойдет
недопустимый доступ к памяти.
В первом случае консольный вывод не детерминирован, поскольку символьный массив не
заканчивается нулевым символом.

20. Работа с массивом char

20
Обратите внимание, что при выводе первого массива в консоль выводится и второй массив, даже если
мы его и не выводим напрямую:

21. Ввод символьных массивов с консоли

21
Функция cin.getline() - считывает последовательность символов, включая пробелы. По умолчанию,
ввод заканчивается, когда считывается символ перевода строки '\n' (например, при нажатии
клавиши Enter).
cin.getline(char_array, num)
char_array - указывает на массив символов для хранения введенных данных/
num - указывает на максимальное количество символов, которое надо сохранить в
массив. Это количество включает символ завершения строки - нулевой байт '\0', который
автоматически добавляться в конец ввода.

22. Изменение символов

Можно изменять отдельные символы в массиве символов:
Вывод на экран можно также осуществить через puts:
22

23. Функции для char массивов

23
В C есть несколько стандартных функций для работы со строками из <cstring>,
например:
strlen(): Вычисляет длину строки.
strcpy(): Копирует одну строку в другую.
strcat(): Конкатенирует две строки.
strcmp(): Сравнивает две строки.

24. Длина строки

24
strlen () – функция вычисления длины строки. Она возвращает длину строки,
переданной ему в качестве аргумента.

25. Отличие strlen и size

25
Длина строки != Размер строки
В str1 размер строки автоматически определяется компилятором и включает нуль-терминатор.
В случае str2 мы задаем размер массива фиксировано, что позволяет хранить строки, которые меньше 10 символов. В str2
помещаются строка из 19 символов, 20 ячейка выделяется под нуль терминатор

26. Копирование

26
strcpy / strcpy_s - функция копирования строк. Она копирует одну строку в другую
строку.
strcpy_s(destination, source)
destination - указатель на место, куда будет скопирована строка.
source - указываем, откуда нужно копировать.
Сама функция будет копировать символы до тех пор, пока не дойдет до специального символа \0,
который означает конец строки.

27. Поиск

27
strchr()– функция поиска первого вхождения символа в строку. Она возвращает
указатель на позицию символа, если он найден, или NULL, если символ отсутствует.
strchr(str, char)
str - строка, в которой выполняется поиск.
char - символ, который ищется в строке.
strrchr() – функция определяет адрес
последнего вхождения символа в строку,
работает аналогично функции strchr(…);

28. Объединение строк

28
strcat(str1, str2) – объединение строки. Два параметра функции, str1 и str2,
представляют собой строки, которые необходимо объединить. Функция
подсоединит строку str2 в конец строки str1.

29. Строковые функции из C

29
Для работы со строками в
Microsoft Visual Studio может понадобиться #define
_CRT_SECURE_NO_WARNINGS это связано с безопасностью в работе с функциями для обработки
строк в C и C++. Использование #define _CRT_SECURE_NO_WARNINGS позволяет вам избежать
предупреждений в Visual Studio.
Функции, такие как strcpy, strcat и т.д. могут быть потенциально небезопасными, если разработчики
не заботятся о размере буфера и могут вызвать переполнение буфера, что может привести к
уязвимостям.

30.

30
Функция strcmp() используется
для сравнения двух строк. Она
принимает два аргумента —
указатели на первые символы
строк, которые вы хотите сравнить.
• Возвращает 0, если строки равны.
• Возвращает
положительное
число, если первая строка больше
второй
в
лексикографическом
порядке.
• Возвращает
отрицательное
число, если первая строка меньше
второй.

31. Функции строк

Копирование строк
strcpy(s1,s2)
выполняет побайтное копирование символов из строки s2 в строку s1
strncpy(s1,s2, n)
выполняет побайтное копирование n символов из строки s2 в строку s1. возвращает
значения s1
Конкатенация строк
strcat(s1,s2)
объединяет строку s2 со строкой s1. Результат сохраняется в s1
strncat(s1,s2,n)
объединяет n символов строки s2 со строкой s1. Результат сохраняется в s1
Сравнение строк
strcmp(s1,s2) с учётом регистра
сравнивает строку s1 со строкой s2 и возвращает результат типа int:
stricmp(s1,s2) без учёта регистра
0 – если строки эквивалентны,
>0 – если s1<s2,
<0 — если s1>s2
strncmp(s1,s2,n) с учётом регистра
сравнивает n символов строки s1 со строкой s2 и возвращает результат типа int:
strnicmp(s1,s2,n) без учёта регистра
0 – если строки эквивалентны,
>0 – если s1<s2,
<0 — если s1>s2

32. Регистр символов

32
Проверка регистра символов:
isupper(c): проверяет, является ли символ заглавной буквой
islower(c): проверяет, является ли символ буквой нижнего регистра
Вывод: Массивы символов (C-style) полезны для понимания низкоуровневого управления
строками. Однако для более удобной и безопасной работы с строками в C++ обычно используют
класс std::string, который автоматически управляет памятью и предоставляет множество
полезных функций для обработки строк.

33.

33
Класс std::string
© К. Поляков, 2006-2012
http://kpolyakov.narod.ru

34. Класс std::string

34
В языке C++ для представления строк существует более совершенный тип данных
string, в основе которого лежит такой же массив символов, завершающийся нулевым
символом, но содержащий еще ряд дополнительных возможностей.
Для корректного использования строк необходимо подключать библиотеку
#include <string>

35. Создание и инициализация строк

35
Можно инициализировать только часть строки через строковую литералу
Немного иначе работает, если в качестве строки мы передаем значение строковой
переменной

36. Обращение к символам строки

36
Переменная типа string также является массивом символов и с каждым символом
этой строки можно работать по-отдельности, обращаясь к ним по индексу, как к
элементам массива.
Для обращения к символам строки по индексу можно использовать оператор
квадратных скобок [] или функцию at().Например:
Учитывайте, что попытка доступа к символу с недопустимым
индексом может привести к ошибке или неожиданному поведению,
поэтому всегда следует проверять границы строки перед
обращением к символам по индексу.

37. Перебор всех символов

37
Для перебора символов в строке в C++, можно использовать цикл for или while в
сочетании с индексацией строки, либо диапазонный for.
Примеры итерации по строке
Диапазонный цикл for

38. Ввод строк с клавиатуры

38
Для ввода строки можно использовать и стандартный поток ввода - cin.
Однако есть недостаток: таким образом считываются только символы до первого
пробела! Это ограничение можно преобразовать в преимущество, если мы знаем,
сколько слов в строке. В этом случае, можно легко получить все слова в отдельные
переменные.
Но если мы хотим считать всю строку, со всеми пробелами до нажатия клавиши Enter
тогда можно использовать функцию getline из библиотеки <string>.
getline(source, var)
source - источник считывания данных (поток ввода
или файл)
var – куда записать данные

39. Методы работы со строками

39
Библиотека string предоставляет несколько полезных методов для получения
информации о строке:
length(): возвращает длину строки.
У метода length есть “брат-близнец” – size(). Между ними нет разницы
size(): возвращает количество символов в строке.
empty(): проверяет, является ли строка пустой.

40. Задача

40
Пользователь вводит строку с клавиатуры. В строке
несколько слов
разделенные пробелами и знаками пунктуации. Во входной строке заменить
все символы 'a' на символы 'b'.

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

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

42. Сложение строк

42
Такая операция над строками называется конкатенацией. Для объединения двух строк
в C++ можно использовать оператор + или метод append().
еще пример
Обратите внимание, что метод append() изменяет исходную строку, добавляя к ней
другую строку.

43. Метод append()

43
Способы вызова append() .
• S.append(n, c) - добавляет в конец строки S n одинаковых символов, равных с. n
имеет целочисленный тип, c - char.
• S.append(T) - добавляет в конец строки S содержимое строки T.
объектом класса string или C-строкой.
T может быть
• S.append(T, pos, count) - добавляет в конец строки S символы строки T начиная с
символа с индексом pos количеством count.

44. Метод resize

44
У метода resize есть две формы записи: с одним и с двумя параметрами. Если он
вызывается с одним параметром, то этот параметр задает новую длину строки.
Второй параметр метода resize задает символ, которым будут заполнены символы в
строке, если размер строки увеличивается в результате изменения размера.

45. Сравнение строк

45
Две строки сравниваются символ за символом с использованием кодов символов
(например, ASCII или Unicode). В процессе сравнения используются следующие
правила:
Сравнение посимвольно:
Сравнение начинается с первого символа каждой строки и продолжается до тех пор,
пока не будет достигнут конец одной из строк или пока не будет найдено различие в
символах. Каждый символ сравнивается с помощью соответствующих кодов символов.
Учет регистра символов:
При сравнении строк обычно учитывается регистр символов, что означает, что символы
верхнего и нижнего регистра считаются разными. Например, строки "hello" и "Hello"
будут считаться разными из-за различия в регистре первой буквы.

46. Сравнение строк

46
Определение отношений между строками:
Если две строки имеют одинаковую длину и все символы совпадают, то строки
считаются равными.
Если строки имеют разную длину, сравнение определяется первым символом,
который отличается.
Если первый отличающийся символ в первой строке имеет меньший код символа, то
первая строка считается "меньше" по лексикографическому порядку.
Если первый отличающийся символ в первой строке имеет больший код символа, то
первая строка считается "больше" по лексикографическому порядку.

47. Сравнение строк

оператор ==
47
операция > (больше)
третий символ первой строки ("m") стоит в алфавите
после четвертого символа второй строки ("l"), то есть
"m" больше чем "l" (несмотря на то, что по количеству
символов "hello" больше чем "helm")

48. Задача на сравнение

48
Есть массив имен, и нам надо отсортировать их в алфавитном порядке
(не используя sort)

49. Метод compare()

49
Для сравнения строк можно вызвать метод compare(). В него передается другая
строка, с которой сравнивается текущая. Метод compare возвращает 0, если
две строки равны.
Если текущая строка больше, то возвращается 1.
Если текущая строка меньше, то возвращается -1.

50. Вариации использования compare

50
Принимает три параметра:
S.compare(index, size, string)
index - индекс первого символа в текущей строке S, начиная с которого
начинается подстрока.
size - количество символов подстроки.
string - строка, с которой сравнивается выбранная подстрока.
То есть сравниваем строку из третьего параметра с подстрокой, которая
начинается с индекса в первом параметре и имеет количество символов,
указанных во втором параметре.

51. Пример

51
Где мы это можно применить? Например, нам надо узнать индекс, с которого встречается
одна строка в другой:
В строке text сравниваем подстроку, которая начинается с индекса i и имеет размер
word.length() символов с строкой word. Если для какого то числа i мы смогли найти подобное
равенство, то выводим число i на консоль.

52. Получение подстроки

substr(ind, count) получает подстроку.
Этот метод принимает два параметра.
ind представляет индекс, с которого начинается подстрока.
count- количество символов извлекаемой подстроки.
Результатом является выделенная строка
52

53. Получение подстроки

53
Если надо извлечь все символы начиная с какого-то определенного, то можно
использовать другую форму метода substr(), который принимает только
начальный индекс:
substr(ind)

54. Проверка начала строки

54
Если надо проверить, начинается ли строка на определенную подстроку, то можно
использовать и ранее рассмотренные методы compare() или substr().
Однако начиная со стандарта C++20 также можно использовать метод starts_with(). Если
текущая строка начинается на другую строку, то возвращается true:

55. Проверка конца строки

55
Аналогично с помощью методов compare() и substr() можно проверить, завершается ли текст
на определенную подстроку.
В стандарт C++20 для этой цели была специально добавлен метод ends_with(). Если текущая
строка заканчивается на другую строку, то возвращается true:

56. Поиск подстроки

56
Метод find() возвращает индекс первого вхождения подстроки или отдельного символа
find(string)
Если
строка
или
символ
не
найдены,
то
возвращается
специальная
константа std::string::npos, которая представляет очень большое число (как видно из примера,
число 18446744073709551615).

57. Поиск подстроки

57
При поиске мы можем проверять результат метода find() на равенство этой константе npos
find имеет ряд дополнительных версий. Так, с помощью второго параметра мы можем указать
индекс, с которого надо вести поиск:
find(string, index)

58. Поиск подстроки

58
Еще одна версия позволяет искать в тексте не всю строку, а только ее часть. Для этого
в качестве третьего параметра передается количество символов из искомой
строки, которые программа будет искать в тексте:
find(string, index, count)
В такой вариации строка должна представлять строковый литерал или строку в Сстиле (например, символьный массив с концевым нулевым байтом).

59. Поиск в обратном порядке

59
Метод rfind() работает аналогично find(), принимает те же самые параметры, только
ищет подстроку в обратном порядке - с конца строки:

60. Поиск любого из набора символов

60
Пара методов - find_first_of() и find_last_of() позволяют найти соответственно первый
и последний индекс любого из набора символов:
В данном случае ищем в строке "Phone number: +23415678901" первую и последнюю позицию
любого из символов из строки "0123456789". То есть таким образом мы найдем начальный и
конечный индекс номера телефона.

61. Поиск любого из набора символов

61
Если нам, наоборот, надо найти позиции символов, которые НЕ представляют
любой символ из набора, то мы можем использовать find_first_not_of() (первая
позиция) и find_last_not_of() (последняя позиция):

62. Задача

62
Написать программу для поиска количества вхождений строки в тексте (текст
сразу инициализирован), то есть выяснить, сколько раз строка встречается в
тексте, если таких вхождений нет, вывести соответствующее сообщение.

63. Вставка строки

63
Для вставки одной строки в другую применяется метод insert(). Он имеет
несколько различных версий. Самая простая версия принимает индекс вставки
и вставляемую строку:
insert(index, string)
В данном случае в строку text начиная с 7-го индекса вставляем строку str. В итоге переменная text
будет равна "insert a string into a text".
Также можно вставлять строковый литерал:

64. Вставка строки

Можно вставлять часть подстроки:
insert(index, string, index_sub, count_char)
index – индекс вставки в строку ( в каком месте начать вставку)
string – из какой строки производим вставку
index_sub – индекс вставки подстроки string
count_char – количество копируемых символов
Здесь в text вставляем из переменной langs
3 символа с 5-го индекса, то есть подстроку "C,".
64

65. Вставка строки

65
Среди других версий insert() также следует отметить версию, которая позволяет вставить
определенный символ определенное число раз:
insert(index, count, char)
index – индекс вставки в строку
count – количество вставок
char – символ вставки
В данном случае вставляем в строку text символ * 5 раз
начиная с 8 индекса.

66. Замена подстроки

66
Для замены в строке некоторой части применяется метод replace().
Самая простая версия принимает три параметра:
replace(index, size, string)
Первый параметр - представляет индекс, с которого надо заменять подстроку.
Второй параметр - количество заменяемых символов.
Третий параметр - на какую строку надо заменить.
Здесь в строке text заменяем 4 символа с 6-го
индекса на строку "C++".

67. Замена подстроки и удаление

67
Заменять можно и на объект string:
Если надо не просто заменить символы, а удалить их из текста, также можно
использовать метод replace() - в этом случае удаляемые символы фактически
заменяются на пустую строку:

68. Удаление символов

Метод clear() позволяет нам очистить существующую строку:
68

69. Удаление символов

69
Также для удаления символов можно использовать метод erase(). В качестве
параметров она принимает начальный индекс удаления и количество удаляемых
символов:
erase(index, count)

70. Удаление всех вхождений определенной подстроки

70
size_t — это специальный беззнаковый целочисленный тип.
Предназначен для представления размера любого объекта в байтах или количество элементов в
массиве/контейнере.
• Беззнаковый – не может принимать отрицательные значения, т.к. размер объекта или индекс массива не может
быть меньше 0.
• Гарантированная вместимость – size_t может хранить максимально возможный размер теоретически
создаваемого объекта любого типа.
Используем вместо int или unsigned int во всех случаях, когда переменная хранит количество чего-нибудь (длину
строки, количество элементов).

71. Вариации erase

71
Оставить определенное количество символов с начала строки, а остальные удалить:
erase(count)
Если при вызове не передается никаких параметров, то удаляются все символы, и в
результате получаем пустую строку:

72. erase в С++20

72
В стандарт С++20 была добавлена функция std::erase(), которая удаляет все
вхождения определенного символа в строке:

73. Задача

73
Пользователь вводит произвольную строку и подстроку. Удалить все встречающиеся
вхождения подстроки из текста.

74. Добавление символа в конец строки и удаление

74
Строки также поддерживают добавление и удаление элементов с конца через
push_back() и pop_back().
push_back(‘char’) используется для добавления
символов в конец строки. После добавления
символа размер строки увеличивается на 1.
pop_back() используется для извлечения
(удаления) 1 символа из конца строки. По мере
удаления символа размер строки уменьшается
на 1.

75. Функции для работы с символами

75
Функция
Расшифровка
isalpha(c)
возвращает значение true, если с является буквой, и false в других случаях
isdigit(c)
проверяет, является ли c цифрой от '0' до '9'
isxdigit(c)
проверяет, является ли c шестнадцатеричной цифрой, от '0' до '9', от 'a' до 'f' или
от 'A' до 'F'
isalnum(c)
возвращает значение true, если с является буквой или цифрой, и false в других
случаях. Аналогично isisalpha(c) || isdigit(c)
isspace(c)
проверяет, является ли c пробелом (' '), символом перевода строки ('\n'),
возвратом каретки ('\r'), перевод страницы ('\f'), горизонтальная ('\t') или
вертикальная ('\v') табуляция
isblank(c)
проверяет, является ли c пробелом (' ') или символом табуляция ('\t')
ispunct(c)
проверяет, является ли c символом пунктуации (один из следующих: _ { } [ ] # ( ) < >
% : ; ? * + - / ^ & | ~ ! "=")

76. Пример 1

76
Надо извлечь из некоторого текста номер телефона:
Здесь проходим по всем символам текста и, если символ представляет цифру, то
заносим его в строку phone.

77. Пример 2

77
Надо сравнить две строки вне зависимости от регистра. Мы могли бы использовать
простую операцию сравнения ==, которая также может сравнивать строки. Но если мы
попытаемся сравнить две строки, в которых хотя бы один символ отличается по
регистру, то они будут не равны:
tolower(c): переводит символ c в нижний регистр
toupper(c): переводит символ c в верхний регистр

78. Пример 2

78

79. Преобразование в строку

79
Может возникнуть необходимость объединить строку с данными других типов,
например, числами. Однако объединить строку мы можем только с другой строкой.
Поэтому данные других типов вначале необходимо преобразовать в строку.
Для преобразования в строку применяется функция std:to_string(), в которую передается
преобразуемое значение:

80. Функции преобразования из строки в число

80
Противоположная задача - преобразовать строку в другой тип:
stoi(): преобразует в тип int
stol(): в long
stoll(): в long long
stoul(): в unsigned long
stoull(): в unsigned long long
stof(): в float
stod(): в double
stold(): в long double
Все они определены в модуле <string>, работают однотипно и в качестве параметра
принимают преобразуемую строку.

81. Работа с русским языком

81
У нас есть три команды связаны с русским языком, но работают они по разному.
system("chcp1251")
1251") и SetConsoleCP(1251)
SetConsoleCP(1251)
system("chcp
- это командыsetlocale(LC_ALL,
для внешней"Rus")
среды,
команды
«переводчики»
нужную
Что
делает: Вызывает
внешнюю наЧто
делает: кодировку.
то же самое, что Что делает: Настраивает внутренние
утилиту Windows для смены
и system(“chcp 1251”), но
правила языка в C/C++ (как сортировать
кодировки всего окна консоли.
смена кодировки
строки, как отображать даты, денежные
setlocale(LC_ALL, "Rus") -происходит
это ужечерез
настройка
прямой таблиц
знаки идля
т.д.). работы с русским
На что влияет: на то, как
языком.
программный интерфейс
символы рисуются в окне и
На что влияет: на работу функций:
(WinAPI), без вызова
считываются с клавиатуры.
tolower, toupper, сравнение строк,
лишних команд.
формат
даты
и чисел.
Минус:
работает
медленно,
т.к
Вывод:
Для работы
в Windows
с русскими символами
нужно
использовать
и то, и
запускается
отдельный
процесс Работает быстро, без
Минус: не влияет на ввод через cin или
другое вместе
.
запуска дополнительных
cmd.exe
scanf и не меняет кодировку самого
процессов
окна консоли.

82. Пример

Если не добавить локаль Правильный вариант
82
Если не добавить перевод кодировки

83. Задача

83
Дано слово.
Выведите:
1) в первой строке - это слово в обратном порядке символов (читая справа налево);
2) слово YES, если исходное слово, является палиндромом (слово, которое одинаково
читается как слева направо, так и справа налево). В противном случае – NO

84. istringstream и ostringstream

84
В языке C++ есть возможность считывать данные из строк (как будто бы из файла) и
выводить данные в строки.
Для этого используются описанные в заголовочном файле <sstream> объекты
istringstream (поток для чтения из строки) и ostringstream (поток для вывода из строки)
std::istringstream— это строковый поток ввода для считывания данных из строки так же,
как cin читает из консоли или ifstream из файла. Он преобразует строковые данные в
типизированные переменные.
std::ostringstream — это строковый поток вывода, предназначенный для записи
форматированных данных в строку, а не на консоль или в файл. Он действует как буфер
памяти, позволяя легко преобразовывать числа и другие типы данных в std::string,
используя оператор <<.

85. std::istringstream — Поток ввода (чтение)

85
Используется, когда у вас уже есть строка (например, прочитанная из файла), и вы
хотите «разобрать» её на части, превращая текст в числа или отдельные слова.
Как работает: Вы инициализируете его строкой и «читаете» из него как из cin.
Используя >> мы считываем данные из файлового потока и записываем полученные
значения в переменные.

86. std::ostringstream — Поток вывода (запись)

86
Используется, когда нужно «склеить» разные типы данных (числа, строки, символы) в
одну строку.
Как работает: Вы «пишете» в него как в cout, а потом забираете результат через метод
.str().
Используя << мы дописываем данные в строковый поток.

87.

87
Пусть в строке s записано два числа через пробел, мы считаем их при используя объект
istringstream, связанный со строкой, затем выведем в объект ostringstream os эти же
числа, увеличенные на 1 и скопируем результат в строку s.

88. std::stringstream

88
std::stringstream —объединяет в себе возможности и istringstream (чтение), и
ostringstream (запись).

89. Метод str()

89
Работа со строковым потоком подразумевает работу с методом .str(), который
выполняет запись и чтение строки в поток.
Этот метод ведет себя по разному в зависимости от того какие аргументы передаются в
него.
• Чтение строки из потока
• Запись строки в поток

90. Чтение из потока (извлечение строки)

90
Если вызвать .str() без аргументов, метод вернет копию всего содержимого потока в
виде std::string. Это удобно, когда вы записывали в поток разные данные (числа, текст)
и теперь хотите получить их одной строкой.

91. Запись в поток (установка новой строки)

91
Если передать строку в качестве аргумента — .str(“string"), текущее содержимое
потока будет заменено на эту строку. Это часто используется для «очистки» или сброса
потока перед повторным использованием.

92. Сброс и очистка

Перед повторным использованием объекта
производить полный сброс и очистку потока.
92
std::stringstream
рекомендуется
nameStream.str("") — очищает содержимое строкового буфера (делает строку внутри
пустой).
nameStream.clear() — сбрасывает флаги ошибок (например, eofbit, если поток был
прочитан до конца), возвращая поток в рабочее состояние.
Зачем это нужно:
Повторное использование: Позволяет использовать один и тот же stringstream
многократно, не создавая новый объект, что эффективнее по памяти.
Устранение ошибок: Если вы попытаетесь записать новые данные в stringstream после
чтения, не вызвав clear(), поток может остаться в нерабочем состоянии из-за
установленного ранее флага конца файла (eof) или ошибки, и данные не запишутся.

93. Сброс и очистка

93

94. Разбор задач

94
Для разделения строки по разделителю (например, по пробелу, по запятой и т.д)
оператор >> не подходит, так как он делит текст только по пробелам. В этом случае на
помощь приходит функция std::getline.
Обычно getline читает данные из файла или консоли до конца строки, но если передать
ей istringstream и символ-разделитель, она будет «откусывать» куски строки до этого
символа.

95. Конвертация типов

95
Если вам нужно не просто разбить строку, а сразу получить числа, можно комбинировать
getline и istringstream:

96. Задача

96
Напишите программу, которая считывает с консоли текст. Далее программа
считывает с консоли символ и находит в тексте все слова, которые начинаются
с этого символа (не важно в каком регистре). В конце на консоль выводится
список всех этих слов.

97. Разбор задачи

97
English     Русский Правила