- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
•при помещении в выходной поток 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; |
// на константу, инициализируется адресом литерала |
|
//выведет: stringpointer |
||||
str2++; |
str2<< endl; |
// |
да, str2 – неконстантный указатель |
|
cout << |
//выведет: 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;
}
Операции со строками
Для работы с С-строками используются библиотечные функции языка С, описанные в заголовках <string.h> и <сstring>, однако надо учитывать, что в этих функциях нет контроля за границами строк.
Инициализация строки
Строка-массив может быть проинициализирована символьными значениями поэлементно. Чтобы символьный массив был представлен как строка, в его конец необходимо поместить завершающий символ ‘\0’– признак конца строки. В этом случае в процессе выполнения программы отслеживается текущая длина строки, а при выводе
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
4 |
|
(помещении в поток cout идентификатора массива) – выводится его содержимое, а не адрес (как для обычного массива).
char stroka[6] = {'M', 'i', 'n', 's', 'k', '\0'}; char stroka1[ ] = {'M', 'i', 'n', 's', 'k', '\0'};
char stroka2[6] = "Minsk"; // ’\0’ добавляется в конец строки автоматически char stroka3 [ ] = "Minsk"; // ’\0’ добавляется в конец строки автоматически char *string1 = "Minsk"; // ’\0’ добавляется в конец строки автоматически
//пример_3 int main()
{
const int MAX = 80; |
//максимальный размер строки |
char str [MAX]; |
//определение строки как символьного массива |
cin >> str; |
//ввод строки, количество символов < 80 |
char s[ ] = "abc"; |
//один символ оставляем для нуль-символа ’\0’ |
//определение и инициализация строки s строковым литералом |
|
|
//символ ’\0’ добавляется в конец строки автоматически |
|
//размер строки равен 4: 3 символа +’\0’, длина строки равна 3 |
char m[ ] = {'a', 'b', 'c'}; //определение и инициализация массива символов m |
|
cout << m << endl; |
//размер массива равен 3, нет символа ’\0’ |
//результаты вывода – ???, до случайно встреченного ’\0’ |
|
char ss[ ] = {'a', 'b', 'c', '\0'}; //определение и инициализация строки ss |
|
char str1[] = "Minsk"; |
//размер строки ss равен 4, длина строки равна 3 |
// строка-массив, проинициализирована строковым литералом, |
// размер str1 равен 6, длина str1 равна 5
//символ ’\0’ добавляется в конец строки автоматически
_getch(); return 0;
}
Строка-указатель инициализируется строковым литералом, который в формате С- строки располагается в сегменте данных загрузочного модуля программы. Имя строки становится синонимом адреса первого символа литерала.
Важно осознать, что в данном случае при выполнении операции присваивания в
ячейку памяти, отведенную для указателя, пересылается не строка, а только указатель на ее начало, т.е. адрес первого символа литерала.
Однако, если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого символа. Например:
char *st = |
"Literal"; |
// |
'\0'добавляется в конец литерала автоматически |
||
cout |
<< |
st |
<< endl; |
// |
Literal |
cout |
<< |
*st << endl; |
// L |
НО!!!
cout << sizeof |
(st) << endl; |
// размер указателя: 4 |
|
||||||
cout |
<< |
sizeof(*st) |
<< |
endl; |
// |
размер одного |
символа: 1 |
||
cout |
<< |
strlen |
(st) |
<< |
endl; |
// |
длина строки: |
7, без |
‘\0’ |
//прототип функции strlen() в <string.h>
Если строка инициализируется литералом, идентичным ранее записанному, то используется ссылка на уже имеющийся литерал.
Возможные ошибки при работе со строками
Основные ошибки при работе с С-строками происходят из-за отсутствия понимания специфики описания строк (строка-массив или строка-указатель)
//пример_4
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
5 |
|