Символьные библиотечные функции
По некоторым оценкам, до 70% времени компьютер тратит на манипуляцию с текстовыми строками. Мы рассмотрим две библиотеки. Первая из них реализуется на основе заголовочного файла <ctype.h>. В это файле содержатся макрокоманды и их макроопределения для работы с отдельными символами. Эти макро работают для основной ASCII-таблицы, т.е. для кодов от 0 до 127. Для кодов 128-255 макро могут не сработать («русскоязычная часть таблицы»).
#include <ctype.h>
isalnum(c) – истина, если с буква или цифра
isalpha(c) - истина, если с буква
isascii(c) – истина, если код с ≤ 127
isdigit(c) – истина, если с символ десятичной цифры
ispunct(c) – истина, если с символ пунктуации
isspace(c) – истина, если с символ пустого места или пробел
и др.
В заголовочном файле <string.h> расположены прототипы функций для работы со строками и блоками памяти. В основном, их параметрами являются указатели на строки. Если выполняется пересылка, то указатель на место назначения должен ссылаться на предварительно зарезервированное место в памяти. Строки должны заканчиваться символом ‘\0’.
#include <string.h>
char strcpy(dest,src); /* копирует из src в dest; возвращает
char *dest,*src; указатель на начало dest */
size_t strlen(s) /*возвращает длину строки s,
const char *s; не включая ‘\0’ size_t≡unsigned*/
и др.
Функций для работы со строками выполняют следующее:
· копирование строк,
· сравнение строк,
· сцепление,
· выделение heap-памяти и копирование строки,
· отыскивание вхождения подстрок, отдельных символов или символов из набора,
· размножение заданного символа по строке,
· изменение строчных и прописных букв.
Функции для работы с блоками памяти копируют заданное число байт из одного места в другое, сравнивают заданное число байтов в блоках, отыскивают заданный символ в блоке или размножают некоторое значение в блоке заданное число раз.
Эти функции не анализируют символ ‘\0’, для них явно указывается длина блока. ‘\0’ рассматривается как обычный символ. Для моделей памяти TINY, SMALL, MEDIUM эти функции работают с блоками, расположенными в пределах общего сегмента данных – до 64 Кбайт и только movedata( ) выполняет межсегментный перенос.
Эти же функции для работы с блоками имеются в заголовочном файле <mem.h>
Пример.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define BLANK “” /* Литерал, создающий ’\0’ */
main(void)
{char *token, byf[81], *separators=”\t,/;”;
int i;
puts(“Введите строку и затем ENTER. \n”);
while(strcmp(gets(buf),BLANK)!=0)
{
i=0;
token=strtok(buf,separators);
while(token!=NULL)
{
printf(“Лексема%d - %s\n”,i,token);
token=strtok(NULL,separators);
i++;
}
} exit(0);
}
Эта программа выделяет из входных строк, поступающих с терминала токены, т.е. группы символов, разделяемые символами табуляции, запятой, точкой или точкой с запятой.
Функция puts() выводит строку в выходящий поток, а gets читает с терминала и возвращает адрес аргумента.
Функция strcmp(s1,s2) – сравнивает строки s1 и s2 и возвращает 0, если символы строк равны, значение >0 , если s1>s2 и <0 , - если s1<s2. Сравнение выполняется на ASCII-кодах слева - направо.
Функция strtok(s1,s2) выделяет токен из строки s1, ограниченную символом из s2. Выделенный токен ограничивается символом ‘\0’. Адрес токена является результатом. Если не выделен токен, то результат NULL. Последующие вызовы strtok с NULL вместо s1 обеспечивают выделение следующих токенов. NULL возвращается, если вся исходная строка просмотрена.
Дата добавления: 2016-05-26; просмотров: 1402;