- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
Внимание!!! Функция strtok изменяет строку, разбиваемую на лексемы, поэтому при необходимости дальнейшего использования строки необходимо позаботиться о ее предварительном сохранении.
Работа с блоками памяти
#include <string.h> #include <mem.h>
прототип |
описание функции |
void *memccpy (void *dest, const void |
копирует блок памяти из буфера-источника src в |
*src, int c, size_t n) |
буфер dest, пока общее число перенесенных байтов |
|
не достигнет значения n или пока не встретится в src |
|
байт, содержащий символ c |
void *memchr (const void *s, int c, |
возвращает указатель на символ c, найденный при |
size_t n) |
просмотре n байтов буфера s; если символ не найден, |
|
возвращается NULL |
int memcmp (const void *s1, const void |
сравнивает n первых байтов буферов s1 и s2 (байты |
*s2, size_t n) |
трактуются как символы); возвращает значение, меньшее |
|
нуля, если s1 < s2; равное нулю, если s1= s2; большее |
|
нуля, если s1 > s2 |
int memicmp (const void *s1, const |
сравнивает n первых байтов буферов s1 и s2 (байты |
void *s2, size_t n) |
трактуются как символы, преобразованные в строчные буквы); |
|
возвращает значение, меньшее нуля, если s1 < s2; |
|
равное нулю, если s1= s2; большее нуля, если s1 > s2 |
void *memcpy (void *dest, const void |
копирует n байтов из буфера-источника src в буфер- |
*src, size_t n) |
назначение dest; буферы не должны перекрываться в |
|
памяти; возвращает указатель на dest |
void *memmove (void *dest, const void |
копирует n байтов из буфера-источника src в буфер- |
*src, size_t n) |
назначение dest; буферы могут перекрываться в |
|
памяти; возвращает указатель на dest |
void *memset (void *s, int c, size_t n) |
устанавливает n байтов буфера s в заданное значение |
|
c; возвращается указатель на буфер s |
Динамические строки
Память под строки, как и под другие массивы, может выделяться как компилятором, так и непосредственно в программе. Как мы видели, длина статической строки должна быть только константным выражением. Чаще всего она задается именованной константой
(как частным случаем константного выражения). Длина динамической строки может задаваться выражением, вычисляемым в ходе выполнения программы.
Для размещения строки в динамической памяти описываем указатель на char и выделяем память с помощью new или malloc.
char *p = new char [m];
char *q = (char *) malloc(m*sizeof(char));
Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании.
Копирование строки в динамическую строку
При копировании строки в динамическую строку необходимо правильно выделять для неё память:
#include <string.h>
int main()
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
24 |
|