Стандартная библиотека языка С обладает богатым и разнообразным набором функций для обработки символов. В языке С для работы с символьными функциями используется заголовочный файл <ctype.h>.
В языке С печатаемыми символами являются те, которые можно отобразить на терминале. В ASCII-средах они расположены между пробелом (0x20) и тильдой (OxFE). Управляющие символы имеют значения, лежащие в диапазоне между нулем и OxlF; в ASCII-средах к ним также относится символ DEL (0x7F).
Исторически сложилось так, что аргументами символьных функций являются целые значения, из которых используется только младший байт. Символьные функции автоматически преобразуют свои аргументы в тип unsigned char. Безусловно, эти функции можно вызывать с символьными аргументами, поскольку в момент вызова функции символы автоматически преобразуются к целому типу.
В заголовке <string.h> определен тип size_t; это тип результата, который получается после применения оператора( в данном случае под оператором подразумевается знак функции) sizeof и представляет собой разновидность целого без знака.
В этой главе описаны только те функции, которые работают с символами типа char. Эти функции были определены стандартом С с самого начала, и, безусловно, они являются наиболее популярными и поддерживаются большинством компиляторов.
В версии С99 к некоторым параметрам нескольких функций, первоначально определенных в версии С89, добавлен квалификатор restrict. При рассмотре¬нии каждой такой функции будет приведен ее прототип, используемый в среде С89 (а также в среде C++), а параметры с атрибутом restrict будут отмечены в описании этой функции.
Символьная строка — основная структура данных в прикладных программах обработки текстовой информации. В терминах языка программирования C под строкой символов понимается любая последовательность символов, которую завершает нулевой код '\0'. В прикладной программе символьная строка может быть задана как строковая константа или как одномерный массив символов. Строковая константа определяется как набор символов, который заключен в двойные кавычки и неявно содержит завершающий символ с нулевым кодом. Следующий пример иллюстрируют два способа определения символьной строки "Unix" в форме строковой константы.
#define OS "Unix"    /* Макроопределение строковой константы */
char* os = "Unix";   /* Указатель строковой константы */
Если символьная строка задается в форме одномерного массива, то все его элементы должны иметь тип char или (unsigned char), а последний символ должен иметь нулевой код. Способ формирования строки символов в массиве определяет выбор класса памяти для хранения его содержимого. Формирование строки символов в символьном массиве любого класса памяти обеспечивает явное присваивание желаемых кодов его элементам. Следующий блок исходного кода образует символьную строку "www" в массиве класса auto из четырех элементов.
{
char web[4];
web[0] = web[1] = web[2] = 'w';
web[3] = '\0';
}
Во внешнем или статическом массиве требуемая строка символов может быть получена путем инициализации его байтов содержимым строковой константы непосредственно при определении массива. Например, следующая декларация заставит компилятор выделить четыре байта для размещения статического массива и заполнить их кодами символов инициализирующей строки.
static char wm[] = "kde";
Аналогичный результат будет получен, если использовать менее компактную универсальную схему инициализации внешних и статических массивов любых типов как показано в следующем примере:
static char wm[] = { 'k', 'd', 'e', '\0' };
В обоих случаях нет необходимости явно задавать размер массива, потому что его автоматически определяет число инициализирующих символов. Если размер символьного массива указан явно и его значение больше требуемой длины строки, то лишние хвостовые элементы будет заполнять нулевой код.
При любом способе формирования доступ к символьной строке обеспечивает указатель типа (char *) или (unsigned char *), который содержит адрес начального символа строки. Такой принцип адресации позволяет передавать строки символов для необходимой функциональной обработки. Основными операциями функциональной обработки строк символов являются: измерение длины, копирование, конкатенация, сравнение, поиск и лексический разбор.
Система программирования C предоставляет обширный набор стандартных функций, которые реализуют перечисленные операции обработки символьных строк. Имена этих функций начинаются с префикса str, а их объектный код сосредоточен в стандартной библиотеке объектных модулей. Их программный интерфейс обеспечивает заголовочный файл <string.h>, где декларированы типы аргументов и кодов возврата всех функций обработки строк символов. Краткое описание принципа действия и применения этих функций, где они группируются по характеру выполняемых операций, приведено ниже.
Измерительная операция применяется, когда нужно определить длину строки или ее фрагмента. Длина строки вычисляется в байтах и равна числу ее символов до завершающего нулевого кода '\0'. Для измерения длины строки обычно используется функция strlen, спецификация формата вызова которой имеет вид:
unsigned strlen(const char* str);
Обращение к функции strlen возвращает длину символьной строки, которая адресована значением str. Например, вызов strlen("Linux") возвращает значение 5. Практическое использование функции strlen поясняет исходный код прикладной процедуры strcut, которая обрезает строку, адресуемую указателем longstr, если ее длина больше значения параметра limit.
/* Ограничение длинной строки */

void strcut(char* longstr, unsigned limit) {
if(strlen(longstr) > limit)
  *(longstr + limit) = '\0';
} /* strcut */
Менее известны измерительные функции strspn и strcspn. Они вычисляют длину начального фрагмента строки, который, соответственно, составляет и исключает ограниченный набор символов. Спецификации формата их вызова имеют вид:
unsigned strspn (const char* str, const char* delimit);
unsigned strcspn(const char* str, const char* delimit);
Обе функции вычисляют максимальную длину начального фрагмента исходной строки, адресуемой указателем str, с учетом содержимого ограничительной строки, которую адресует указатель delimit. При этом функция strspn выявляет начальный фрагмент исходной строки, который состоит только из символов ограничительной строки. Функция strcspn, наоборот, определяет начальный фрагмент исходной строки, который не содержит символов из ограничительной строки. Обе функции передают результат вычислений через код возврата. Например, вызов функции strspn("happy", "path") возвратит значение 4, а обращение к функции strcspn при тех же аргументах вернет значение 0.
Действие функций strspn и strcspn можно рассматривать как поиск индекса позиции первого символа исходной строки, который, соответственно, не принадлежит или, наоборот, принадлежит кодовому набору ограничительной строки. В такой трактовке данные функции могут быть полезны, если нужно выделить информативную часть заданной строки. Например, исходный код прикладной функции deblank демонстрирует как обеспечить пропуск всех начальных пробелов и табуляций, используя функцию strspn:
/* Пропуск начальных пробелов и табуляций */

char* deblank(char* str) {
  return(str + strspn(str, " \t"));
} /* deblank */