
- •Лекция 13
- •Основные понятия
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •Преобразование значения базового типа в с-строку
- •Ввод ограниченного числа символов строки
- •Функция вывода строки
- •Особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с с-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •Преобразование строки в число
- •Преобразование числа в строку
- •Преобразование строчных символов строки в прописные и наоборот
- •Реверс строки
- •Заполнение строки символом
- •Пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
Лекция 13
Строки
Основные понятия 2
Определение С-строк 3
строка как массив символов 3
строка как указатель на char 3
строка как элемент массива строк 3
строка как элемент массива указателей на char 3
особенности работы с С-строками в С++ 3
Операции со строками 4
Инициализация строки 4
Возможные ошибки при работе со строками 5
Ввод-вывод строк 6
преобразование значения базового типа в С-строку 10
ввод ограниченного числа символов строки 10
функция вывода строки 10
особенности посимвольного вывода строки 11
Копирование строк 11
Оптимизация текста программы на примере функции копирования 12
Функции для работы с С-строками 13
Определение длины строки 13
Копирование строк 13
Объединение строк 14
Сравнение строк 16
Поиск символа в строке 17
Проверка принадлежности символа некоторому множеству 17
Поиск строки в строке 18
Преобразование и заполнение строк 19
преобразование строки в число 19
преобразование числа в строку 20
преобразование строчных символов строки в прописные и наоборот 21
реверс строки 22
заполнение строки символом 22
пример применения функций преобразования 22
Выделение лексем 23
Динамические строки 24
Копирование строки в динамическую строку 24
Передача строки в функцию в качестве параметра 25
Пример_1: в main()– строка-массив; в функции – строка-указатель 25
Пример_2: в main() – строка-указатель; в функции – строка-указатель 26
Передача в функцию массива строк 27
Примеры работы со строками 27
Определение длины строки с помощью функции пользователя 27
Реверс строки (перегрузка функций) 27
Удаление начальных пробелов из строки 28
Проверка, является ли строка целым числом 28
Проверка, является ли строка 16-ичным целым числом 29
Проверка, является ли строка дробным числом без знака 29
Перевод двоичного числа в десятичное 29
Перевод шестнадцатеричного числа в десятичное 30
Перевод десятичного числа в двоичное 30
Перевод десятичного числа в с/с от 2-х до 10 31
Перевод десятичного числа в шестнадцатеричное 31
Определение количества слов в фразе 31
Выделение слов в тексте по нажатию произвольной клавиши 32
Сортировка вводимых с клавиатуры строк * 33
Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv * 34
Инвертирование строки с помощью рекурсивной функции 34
Основные понятия
В С отсутствует специальный строковый тип и поэтому используются массивы элементов типа char, всегда содержащие в конце последовательности значащих символов код ’\0’, (концевой символ строки, иначе – ее терминальный символ). Этот тип называют также char*-строками, так как он может быть представлен в виде указателя на char.
В С++ сохранены те же возможности и разрешено использовать все библиотечные функции языка С для работы со строками (будем называть их С-строки). Для подключения этих библиотечных средств к программам используются заголовки <cstring> и <string.h>.
Применение С-строк в ряде случаев неудобно: во-первых, С-строка всегда ограничена тем массивом с элементами типа char, который выделен для ее представления; во-вторых, в функциях для работы с С-строками нет контроля за их границами. Поэтому в стандартную библиотеку языка С++ введено несколько классов, позволяющих определять строковые переменные в виде объектов и выполнять над ними ряд операций (например, строку как объект класса string будем рассматривать во 2-ом семестре).
Тем не менее, свое знакомство со строками мы начнем с С-строк.
Как и другие типы данных, строки могут быть: переменными и константами.
Напомним, некоторые особенности использования строковых констант.
В строковый литерал можно включать непечатаемые символы:
”abc\ndef” //символы будут напечатаны в две строки
”abc\\ndef” //будет выдано abc\ndef
Длинный строковый литерал предполагает запись:
”abc\ def” // напечатает abcdef; т.к. \ – символ продолжения строки
НО ”abc<enter> def” // error!!!
Строка ”abc\000def” будет обрабатываться как abc (‘\0’ – означает конец строки).
В строковом литерале возможно использование нескольких строк:
"текст1""текст2""текст3";
Оператор
cout << "abc\\ndef" "aaa" "mmm"<< endl;
выведет строку abc\ndefaaammm.
Строку-константу можно задать с помощью директивы препроцессора и с помощью модификатора const: #define OTVET1 "odin" //препроцессорная строка-константа
const char str[3] ="dwa"; // типизированная строка-константа
Определение С-строк
строка как массив символов
const int n=10;
char st [n]; //строка-массив
char empty_str [ ]= ""; //нулевая (пустая) строка;
Равносильны определения строк:
char st1 [] = "Minsk"; //'\0' добавляется в конец строки автоматически
char st2 [6] = "Minsk";
char st3 [6] = {'M', 'i', 'n', 's', 'k', '\0'};
строка как указатель на char
char *st = “Minsk”; //строка-указатель
char *empty_str = ""; // нулевая (пустая) строка;
строка как элемент массива строк1
char den[][10]= {"poned", "vtor", "sreda", "chetv", "pjatn", "sub", "voskr"};
строка как элемент массива указателей на char2
char *otvet1[] = {"odin", "dwa"};
особенности работы с С-строками в С++
для представления С-строк используются массивы элементов типа char, содержащие в конце последовательности значащих символов код ’\0’;
С-строка ограничена размером массива, который выделен для ее представления; размер нединамической С-строки должен быть задан только константным выражением;
cтрока может быть проинициализирована как поэлементно символьными значениями (с обязательным завершающим символом ‘\0’), так и значением строкового литерала (завершающий символ ‘\0’ формируется в этом случае в конце строки автоматически);
нулевая строка – это строка, которая начинается с 0-символа ‘\0’ (ее длина равна нулю, но в памяти она может занимать больше одного байта); нулевой указатель на строку (char *p_str = NULL;) не является эквивалентом нулевой строки;
текущая длина строки отслеживается в процессе выполнения действий над строкой;
при помещении в выходной поток cout имени символьного массива выводится не адрес массива (как для массивов с элементами другого типа), а его содержимое (до завершающего символа ‘\0’).
//пример_1
int main()
{
char str1[] = "string-array"; // строка-массив: str1– указатель-константа // на неконстантные данные, инициализируется литералом
cout << str1 << endl; //выведет: string-array
// str1++; // error!!!, str1 – указатель-константа
str1[0]='a'; // да, str1 – указатель на неконстантные данные
cout << str1[0]<< endl; // выведет первый элемент строки: a
char* str2 = "string-pointer"; // строка-указатель: str2– неконстантный указатель // на константу, инициализируется адресом литерала
cout << str2 << endl; //выведет: string- pointer
str2++; // да, str2 – неконстантный указатель
cout << str2<< endl; //выведет: tring-pointer
// str2[1]='a'; // error!!!, str2 – указатель на константу
_getch();
return 0;
}
//пример_2
int main()
{ char *otvet[][10] = {"odin", "dwa"}; //массив указателей-констант на неконстантные
//данные, инициализируется значениями литералов
cout << otvet[0] << endl; //вывод строки как элемента массива строк: odin
cout << otvet[1] << endl; //вывод строки как элемента массива строк: dwa
// otvet[0]++; // error!!!, otvet – указатель-константа
otvet [0][0]='a'; // да, otvet – указатель на неконстантные данные
cout << otvet [0][0]<< endl; //выведет: a
char *otvet1[] = {"odin", "dwa"}; //массив неконстантных указателей на константные
//данные, инициализируется адресами литералов
cout << otvet1[0] << endl; //вывод строки как элемента массива указателей:odin
cout << otvet1[1] << endl; //вывод строки как элемента массива указателей:dwa
otvet1[0]++; // да, otvet1 – неконстантный указатель
cout << otvet1[0] << endl; //выведет: din
// otvet1[0][0]='a'; //error!!!,otvet1 – указатель на константные данные
_getch();
return 0;
}