1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов

Символьные строки в языке С - это массивы типа char, которые заканчива­ются нуль-символом '\0' (отметим, что в языке PASCAL есть полный аналог та­ких строк - открытые строки или null-terminated strings). Строковые константы (последовательности символов в "") размещаются в статической памяти и всегда заканчиваются нуль-символом, который явно не задается. Сама строковая кон­станта является константой-указателем типа char* . Строковую переменную можно описать в форме:

diar имя [ длина ] = " строка " ; При этом длину строки можно опустить, память будет выделена по фактической длине строковой константы + 1 байт для нуль-символа. Поскольку имя строки является указателем, возможен альтернативный вариант описания:

char* имя = " строка " ; Различие между двумя описаниями состоит в том, что имя массива есть констан­та-указатель, ее значение нельзя изменить, а во втором случае описана перемен­ная-указатель, которая лишь первоначально указывает на место в памяти, зани­маемое константой " строка ", но впоследствии может принять любое другое значение.

Массив символьных строк можно описать в виде :

char* имя [ длина ] = { " строка} " , " строка2 " , ... } ;

или

char имя [ длина массива ] [ длина строки ] = { " строка} " , " строка2 " ,

... };

Все элементы массива строк в любом случае являются указателями на соответст­вующую строку, но в первом случае под каждый элемент массива будет отведена память по фактической длине строковой константы, а во втором - количество байт, равное описателю длина строки + 1 байт. Поэтому говорят, что первое описание создает непрямоугольный массив строк, а второе - прямоугольный. Для ввода и вывод строк служат функции

char* gets(char* строка )

int puts(char* строка ) Функция gets читает строку до символа '\n' и заменяет его нуль-символом. Она возвращает адрес введенной строки или нулевой адрес NULL при возникнове­нии ошибки. Функция puts выводит символы строки до достижения нуль­символа, который заменяется на '\n', возвращает 0 при успешном завершении или EOF ( число, равное -1 ) при возникновении ошибки. Функция gets "не ин­тересуется" размером вводимой переменной и записывает в память, начиная с адреса строка, все введенные символы, так что ввод слишком длинной строки, вероятнее всего, приведет к порче значений других переменных, расположенных в памяти после вводимой переменной; кроме того, в этом случае в переменной не уместится нуль-символ и она будет непригодна для дальнейшего использования. Функция puts также устроена весьма просто и выводит сколь угодно большое количество символов, пока не встретит в памяти нулевой байт или не выйдет за пределы доступной памяти.

Для ввода и вывода строк можно использовать и функции scanf и printf с форматом %s. Функция scanf считывает строку до первого пробела или специ­ального символа. Функция printf в отличие от puts не осуществляет переход на новую строку. Полное описание функций scanf и printf имеет вид:

int scanf(char *format, список ввода ); int printf(char *format [ , список вывода J ); Эти функции можно использовать не только со строкой формата, заданной стро­ковой константой, но и с любой строковой переменной, что делает форматный вывод весьма гибким.

Для работы со строками существует специальная библиотека функций, про­тотипы которых описаны в файле string.h . Эта библиотека включает:

1) char* strcat(char* s1,char* s2) - конкатенирует строку s2 в конец строки s1, возвращает s1;

2) char* strncat(char* s1,char* s2,size_t maxlen) - конкатенирует не более maxlen символов строки s2 в конец строки s1, возвращает s1 (здесь и далее size_t - это тип размера объектов в языке С, он определен как typedef unsigned size_t; );

3) size_t strlen(char* s) - возвращает длину строки s не считая нулевого символа;

4) char* strcpy(char* s1,char* s2) - копирует s2 в s1, возвращает s1;

5) char* strncpy(char* s1,char* s2,size_t maxlen) - копирует не более maxlen символов s2 в s1, возвращает s1;

6) int strcmp(char* s1,char* s2) - возвращает разницу в ASCII кодах первой пары несовпадающих символов строк s1 и s2;

7) int strncmp(char* s1,char* s2,size_t maxlen) - strcmp, учитывающая не бо­лее maxlen первых символов.

8) int stricmp(char* s1,char* s2) - strcmp, не учитывающая регистр;

9) int strncmpi(char* s1,char* s2,size_t maxlen) - strncmp, не учитывающая регистр;

10) char* strlwr(char* s) - переводит строку s в нижний регистр, возвращает указатель на s;

11) char* strupr(char* s) - переводит строку s в верхний регистр, возвращает указатель на s;

12) char* strchr(char* s,int c) - возвращает указатель на первое вхождение символа c в строку s или NULL;

13) char* strrchr(char* s,int c) - возвращает указатель на последнее вхожде­ние символа c в строку s или NULL;

14) size_t strspn(char* s1,char* s2) - возвращает длину начального сегмента s1, который содержит только символы из строки s2;

15) size_t strcspn(char* s1,char* s2) - возвращает длину начального сегмента s1, который не содержит ни одного символа из s2;

16) char* strdup(char* s) - распределяет память и возвращает указатель на копию строки s;

17) char* strset(char* s,int c) - заполняет строку s символом c, возвращает s;

18) char* strnset(char* s,int c,size_t n) - заполняет не более n первых симво­лов строки s символом c, возвращает s;

19) char* strpbrk(char* s1,char* s2) - возвращает указатель на первое вхож­дение какого-либо символа строки s2 в строку s1 или NULL;

20) char* strrev(char* s) - переставляет символы строки s в обратном поряд­ке, возвращает s;

21) char* strstr(char* s1,char* s2) - возвращает указатель на первое вхожде­ние подстроки s2 в строку s1 или NULL.

Для преобразования чисел и других данных в строку удобно пользоваться функцией sprintf , описанной в файле stdio.h :

int sprintf(char* s,char* формат [ , список вывода J ) которая работает подобно функции printf, но вместо устройства вывода исполь­зует строку s.

Для преобразования строки в число служат функции, описанные в файле stdlib.h :

double atof(char* s) - преобразует строку s в вещественное число;

int atoi(char* s) - преобразует строку s в целое число;

long atol(char* s) - преобразует строку s в длинное целое число.

Функции возвращают результат преобразования строки до первого ошибоч­ного символа или до нуль-символа. Они не предоставляют средств контроля за правильностью записи числа в исходной строке.

Для проверки принадлежности отдельного символа некоторому множеству символов и преобразования символов используются макроопределения (см. 1.14), описанные в файле ctype.h . Макроопределения проверки символов воз­вращают ненулевое значение, если символ входит в множество, и 0 - в против­ном случае:

isalpha(c)       - латинская буква

islower(c)       - малая латинская буква

isupper(c)       - заглавная латинская буква

isdigit(c) - цифра

isxdigit(c)       - 1б-ричная цифра ,0\.'97A\.,F7a\.T isalnum(c)      - латинская буква или цифра

188расе(с)       - пробел или управляющий символ \1",\п,\г,\1,\у 18сп1г1(с)        - невидимые символы

18рыпс1(с)       - печатаемый символ, кроме пробела, букв и цифр isgrарh(с)       - печатаемый символ, кроме пробела 18рпп1(с)        - печатаемый символ, включая пробел Макроопределения преобразования символов:

!оиррег(с) - для малой латинской буквы возвращает соответствующую большую букву, в остальных случаях возвращает с ;

1о1о\уег(с) - для большой латинской буквы возвращает соответствующую малую букву, в остальных случаях возвращает с .