Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб6.Строки.doc
Скачиваний:
4
Добавлен:
23.08.2019
Размер:
256.51 Кб
Скачать

Практикум на ЭВМ. Лаб.5. Строки марта 2012

Содержание

Строки 1

Производные типы 2

Строка как массив символов 2

Операции со строками 3

Создание строк 3

Длина строки 4

Конкатенация (сцепление) строк 4

Присваивание строк 4

Сравнение строк 5

Поиск в строке 6

Преобразования строк 6

Заключение 7

Приложение 7

Копирование 7

memcpy 7

memmove 8

strcpy 8

strncpy 9

Конкатенация 9

strcat 9

strncat 10

Сравнение 10

memcmp 10

strcmp 11

strcoll 11

strncmp 12

strxfrm 12

Поиск 12

memchr 12

strchr 13

strcspn 14

strpbrk 14

strrchr 15

strspn 15

strstr 15

strtok 16

Разное 17

memset 17

strerror 17

strlen 18

NULL 18

size_t 18

Строки

Строковая константа, или строковый литерал, - это нуль или более символов, заключенных в двойные кавычки, как, например, "Это строковая константа” или "" ‑ (пустая строка). Кавычки не входят в строку, а служат только ее ограничителями. Так же, как и в символьные константы, в строки можно включать эскейп-последовательности. \", например, представляет собой двойную кавычку. Строковые константы можно конкатенировать ("сцеплять”) во время компиляции; например, запись двух строк "Здравствуй," " мир!" эквивалентна записи одной следующей строки: "Здравствуй, мир!" Указанное свойство позволяет разбивать длинные строки на части и располагать эти части на отдельных строчках.

Строка – это последовательность символов. Последовательности в Си представляются массивами или указателями.

Неприятно – не получится понять, что такое строка в Си, если не знать, что такое массив, указатель и как они между собой связаны.

Производные типы

Исходя из основных (и определенных пользователем) типов, можно задать другие, производные типы с помощью следующих операций описания:

* указатель

& ссылка

[] массив

() функция

Например:

int* a; // указатель на целое. Его значением является адрес

float v[10]; // описание вектора из 10 действительных чисел.

char* p[20]; // массив из 20 символьных указателей

void f(int); // функция, аргумент – целое, значения не возвращает

Можно описать сразу несколько имен в одном описании. Тогда оно содержит вместо одного имени список отделяемых друг от друга запятыми имен. Например, можно так описать две переменные целого типа:

int x, y; // int x; int y;

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

int * p, y; // int* p; int y; НО НЕ int* y;

int x, *p; // int x; int* p;

int v[10], *p; // int v[10]; int* p;

Такие описания запутывают программу, и, возможно, их следует избегать.

Строка как массив символов

Исторически символ занимает 1 байт, в этом случае он имеет тип char. Существуют и другие кодировки, в которых символ представляется, например, двумя байтами. Для работы с такими строками требуются специальные функции. Мы будем рассматривать только традиционные строки из однобайтовых символов. В дальнейшем для простоты по большей части говорится о массивах, но почти все сказанное относится и к указателям.

Итак, строкf в Си – массив, например

char s[1000];

строка не более чем из 1000 символов. Имя массива s одновременно является указателем на начало массива. Поэтому строку можно описать и так:

char *s;

Но при таком описании ничего неизвестно о длине строки. Очевидно, что последовательность должна быть как-то ограничена, то есть мы должны знать, где она заканчивается. В Си строка ограничивается специальным символом, называемым нуль-терминатором. Это символ с кодом нуль: ‘\0’. Он является последним символом строки. Можно сказать, что Си-строка – это указатель типа char* на область памяти, заканчивающуюся символом с кодом 0.

Над указателями можно совершать некоторые арифметические действия. Так, например, можно подсчитать число символов в строке, не считая завершающего символа ‘\0’:

char* p;

………………// здесь определяется строка p

int i = 0;

while (*p++) i++;

Теперь i равно длине строки. Для вычисления длины строки имеется библиотечная функция strlen(s).

Другой способ найти длину строки – это найти сначала конец строки, а затем вычесть адрес начала из адреса её конца.

char* p;

int len;

……………………..// здесь определяется строка p

char* q = p;

while (*q++);

len = q ‑ p ‑ 1;}

Для определения длины строки всякий раз необходимо искать ее конец, сравнивая ее символы с нуль-терминатором. Чем длиннее строка ‑ тем больше операций. Об этом следует помнить при использовании длины строки, например, в циклах. Если между итерациями строка не изменяется, ее длину следует вычислить заранее, а потом использовать полученное значение.

ПРЕДУПРЕЖДЕНИЕ

Не путайте ‘\0’, ‘0’ и “0”. Первое – символьный литерал, соответствующий символу с кодом 0. Второе – такой же литерал, но обозначающий цифру 0, ее код в ASCII-кодировке 48. Третий — это строковый литерал, содержащий два символа, цифру 0 и нуль-терминатор.