Функции работы со строками и символами

Строка представляет собой массив символов, заканчивающийся нуль-символом. В С++ есть две возможности работы со строками: функции, унаследованные из библиотеки С (заголовочный файл <string.h> или <cstring>), и библиотечный класс С++ string.

Библиотека С содержит функции копирования строк (strcpy, strncpy), сравнения (strcmp, strncmp), объединения строк (strcat, strncat), поиска подстроки (strstr), поиска вхождения символа (strchr, strnchr, strbrk) определения длины строки strlen и другие.

char *strcat (char *s1, char *s2);

добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.

char *strchr (char *s, int ch);

возвращает указатель на первое вхождение символа ch в строку s, если его нет, возвращает NULL.

int *strcmp ( char *s1, char *s2);

сравнивает строки s1и s2 и возвращает отрицательное (если s1<s2), нулевое ( s1=s2) или положительное значение (s1>s2 ).

char *strcpy (char *s1, char *s2);

копирует s2 в s1и возвращает s1.

size_t strlen(char*s);

возвращает длину строки(без завершающего символа).

char *strncat (char *s1, char *s2, size_t n);

добавляет не более n символов из s2 к s1 и возвращает s1.

int strncmp (char *s1, char *s2, size_t n);

сравнивает s1 и первые n символов строки s1. Возвращает такие же значения, что и strcmp.

char *strncpy (char *s1, char *s2, size_t n);

коприрует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки s2 превышает n или равна ему, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа.

char *strchr (char *s, int ch);

возвращает указатель на первое вхождение символа ch в s справа, если его нет, возвращает NULL.

char *strstr (char *s1, char *s2);

выполняет поиск первого вхождения подстроки s2 в s1. В случае удачного поиска возвращает указатель на элемент из s1, с которого начинается s2, и NULL − в противном случае.

double strtod (const char *str, char **end);

преобразует строку символов в числовое значение и возвращает его. При переполнении возвращает +/-HUGE_VAL. При невозможности выполнить преобразование или исчезновении порядка возвращает 0. В обоих последних случаях end указывает на символ, на котором преобразование завершается.

В заголовочном файлe <stdlib.h> содержатся полезные функции преобразования строк в числа:

double atof (const char *p);

преобразует переданную строку в double.

int atoi ( const char *p);

преобразует переданную строку в int.

long atol ( const char *p);

преобразует переданную строку в long.

Пробелы и табуляции в начале строки пропускаются. Преобразование прекращается при встрече недопустимого символа или конца строки. Если строку нельзя преобразовать в число, возвращается 0. Если число выходит за пределы диапазона данного типа, переменной errno (заголовочный файл <cerrno>) присваивается значение ERANGE и возвращается допустимое число.

Обратные преобразования можно сделать с помощью функции sprintf:

int sprintf (char *buffer, const char *format [, argument,...]);

выводит в строку buffer значения переменных, перечисленных в списке, в формате, определенном строкой format.

Для работы с символами в стандартной библиотеке (заголовочный файл <ctype.h>) есть следующие функции:

Имя функции Проверка на принадлежность символа множеству
isalpha букв (A-Z, a-z, 0-9)
isalnum букв и цифр(A-Z, a-z, 0-9)
isdigit цифр (0-9)
isxdigit шестнадцатеричных цифр (0-9, A−F, a−f)
iscntrl управляющих символов (с кодами 0..31 и 127)
islower букв нижнего регистра (a-z)
isupper букв верхнего регистра (A-Z)
isgraph печатаемых символов, кроме пробела
ispunct знаков пунктуации
isprint печатаемых символов
isspace символов-разделителей

 

Функции принимают величину типа int и возвращают результат true, если условие выполняется.

Следующие функции переводят символ ch в нижний и верхний регистр соответственно:

int tolower (int ch);

int to upper (int ch);

 

 

Задание

Написать программу – “Текстовый редактор”. Предусмотреть следующие функции:

- просмотр текста;

- добавление новых строк;

- редактирование строк;

- удаление строк.

Математические функции

С++ унаследовал из С стандартные математические функции, описание которых находится в заголовочном файле <math.h> (<cmath>). Они позволяют получить абсолютное значение (abs, fabs), округленное число (ceil, floor), квадратный корень (sqrt), степень (pow), значения тригонометрических функций (sin, cos, tan, asin, acos, atan и др.), экспоненту (exp), логарифм (log, log10), дробную и целую части числа (modf), остаток от деления (fmod) и ряд других.

Ошибки индицируются установкой errno из <errno.h> в значение EDOM для ошибок из области определения и ERANGE для ошибок выхода за пределы определения.

Функции

int abs (int num);

long labs(long int num);

double fabs(double x);

возвращают модуль целого и дробного числа соответственно.

Функции

double acos(double x);

double asin(double x);

double atan(double x);

double atan2(double x);

возвращают значение арккосинуса, арксинуса, арктангенса и арккотангенса соответственно. Значение возвращается в радианах.

double cos(double x);

double sin(double x);

double tan(double x);

double tan2(double x);

возвращают косинус, синус, тангенс, котангенс аргумента, заданного в радианах.

div_t div (int numerator, int denomerator);

делит целое numerator на целое denomerator, возвращая результат в структуре, содержащей частное от деления и остаток:

struct div_t {

int quot;

int rem;

}

double exp(double x);

возвращает результат возведения е в степень х.

double floor (double x);

округляет вещественное число х до ближайшего меньшего целого и возвращает его как вещественное число.

double log (double x);

double log10 (double x);

возвращают значение натурального и десятичного логарифмов соответственно.

double modf (double x, double *intptr);

разбивает х на целую и дробную части, причем дробную часть числа возвращает, а целую часть числа помещает по адресу, определяемому указателем intptr.

double pow (double x, double y);

вычисляет степень х основания у.

int rand(void);

генерирует случайное число в диапазоне от 0 до RAND_MAX (константа описана в <stdlib.h>.

double sqrt(double x);

возвращает квадратный корень из х.

Задание

Написать программу, моделирующую игру в кости.


 

Директивы препроцессора

Препроцессором называется первая фаза компиляции. Инструкции препроцессора называются директивами. Они должны начинаться с символа #.

Директива #include

Директива #include <имя файла> вставляет содержимое указанного файла в ту точку исходного файла, где она записана. Включаемый файл также может содержать директивы #include. Вместо угловых скобок можно использовать двойные кавычки, тогда можно указывать полный путь к файлу.

Директива #include является простейшим средством согласованности объявлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.

Заголовочные файлы имеют расширение .h и могут содержать:

- определения типов, констант, встроенных функций, шаблонов, перечислений;

- объявления функций, данных, имен, шаблонов;

- пространства имен (см. далее);

- директивы препроцессора;

- комментарии.

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

При указании заголовочных файлов стандартной библиотеки расширение .h можно опускать. Для каждого файла библиотеки С с именем <name.h> имеется соответствующий файл библиотеки С++ с именем <сname>, в котором те же средства описываются в пространстве имен std (см. далее).

Директива #define

Данная директива определяет подстановку в тексте программы. Она используется для определения:

- символических констант:

#define имя текст_подстановки;

- макросов, которые выглядят как функции, но реализуются подстановкой их текста в текст программы:

#define имя(параметры) текст_подстановки;

- символов, управляющих условной компиляцией. Эти символы используются вместе с директивами #ifdef #ifndef. Формат:

#define имя;

Примеры

#define VASIA "Василий"

#define MAX(x,y) ((x)>(y)? (x): (y))

Имена рекомендуется писать большими буквами, чтобы зрительно отличать их от имен переменных и функций. С макросом работают как с обычной функцией, например, макрос MAX может быть вызван как y=MAX(sum1,sum2); в тексте программы он будет заменен на выражение y= ((sum1)>(sum2)? (sum1): (sum2));

!!! Макросы и символические константы унаследованы из языка С, при написании программ на С++ лучше их избегать. Вместо символических констант лучше использовать const и enum, а вместо макросов − встроенные функции или шаблоны. Встроенную функцию определяют с помощью модификатора inline, который помещается перед типом функции. Код встроенной функции помещается в каждую точку вызова, это сокращает расходы на вызов функции.