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

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

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

сhar имя [ длина ] = “ строка “ ;

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

char* имя = “ строка “ ;

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

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

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

или

char имя [ длина массива ] [ длина строки ] = { “ строка1 “ , “ строка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 [ , список вывода ] );

Эти функции можно использовать не только со строкой формата, заданной строковой константой, но и с любой строковой переменной, что делает форматный вывод весьма гибким.

Для работы со строками существует специальная библиотека функций, прототипы которых описаны в файле 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 :

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]