Строка представляет собой массив символов, заканчивающийся нуль-символом. В С++ есть две возможности работы со строками: функции, унаследованные из библиотеки С (заголовочный файл <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, который помещается перед типом функции. Код встроенной функции помещается в каждую точку вызова, это сокращает расходы на вызов функции.