Строки и литералыДля того чтобы работать с текстом, в языке Си++ не существует особого встроенного типа данных. Текст представляется в виде последовательности знаков (байтов), заканчивающейся нулевым байтом. Иногда такое представление называют Си-строки, поскольку оно появилось в языке Си. Кроме того, в Си++ можно создать классы для более удобной работы с текстами (готовые классы для представления строк имеются в стандартной библиотеке шаблонов). Строки представляются в виде массива байтов: char string[20];
string[0] = 'H';
string[1] = 'e';
string[2] = 'l';
string[3] = 'l';
string[4] = 'o';
string[5] = 0; В массиве string записана строка "Hello". При этом мы использовали только 6 из 20 элементов массива. Для записи строковых констант в программе используются литералы. Литерал – это последовательность знаков, заключенная в двойные кавычки: "Это строка"
"0123456789"
"*" Заметим, что символ, заключенный в двойные кавычки, отличается от символа, заключенного в апострофы. Литерал "*" обозначает два байта: первый байт содержит символ звездочки, второй байт содержит ноль. Константа '*' обозначает один байт, содержащий знак звездочки. С помощью литералов можно инициализировать массивы: char alldigits[] = "0123456789"; Размер массива явно не задан, он определяется исходя из размера инициализирующего его литерала, в данном случае 11 (10 символов плюс нулевой байт). При работе со строками особенно часто используется связь между массивами и указателями. Значение литерала – это массив неизменяемых байтов нужного размера. Строковый литерал может быть присвоен указателю на char: const char* message = "Сообщение программы"; Значение литерала – это адрес его первого байта, указатель на начало строки. В следующем примере функция CopyString копирует первую строку во вторую: void
CopyString(char* src, char* dst)
{
while (*dst++ = *src++)
;
*dst = 0;
}
int
main()
{
char first[] = "Первая строка";
char second[100];
CopyString(first, second);
return 1;
} Указатель на байт (тип char* ) указывает на начало строки. Предположим, нам нужно подсчитать количество цифр в строке, на которую показывает указатель str: #include <ctype.h>
int count = 0;
while (*str != 0) {
// признак конца строки – ноль
if (isdigit(*str++))
count++;
// проверить байт, на который
// указывает str, и сдвинуть
// указатель на следующий байт
} При выходе из цикла while переменная count содержит количество цифр в строке str, а сам указатель str указывает на конец строки – нулевой байт. Чтобы проверить, является ли текущий символ цифрой, используется функция isdigit. Это одна из многих стандартных функций языка, предназначенных для работы с символами и строками. С помощью функций стандартной библиотеки языка реализованы многие часто используемые операции над символьными строками. В большинстве своем в качестве строк они воспринимаютуказатели. Приведем ряд наиболее употребительных. Прежде чем использовать эти указатели в программе, нужно подключить их описания с помощью операторов #include <string.h> и#include <ctype.h>. char* strcpy(char* target,
const char* source); Копировать строку source по адресу target, включая завершающий нулевой байт. Функция предполагает, что памяти, выделенной по адресу target, достаточно для копируемой строки. В качестве результата функция возвращает адрес первой строки. char* strcat(char* target,
const char* source); Присоединить вторую строку с конца первой, включая завершающий нулевой байт. На место завершающего нулевого байта первой строки переписывается первый символ второй строки. В результате по адресу target получается строка, образованная слиянием первой со второй. В качестве результата функция возвращает адрес первой строки. int strcmp(const char* string1,
const char* string2); Сравнить две строки в лексикографическом порядке (по алфавиту). Если первая строка должна стоять по алфавиту раньше, чем вторая, то результат функции меньше нуля, если позже – больше нуля, и ноль, если две строки равны. size_t strlen(const char* string); Определить длину строки в байтах, не считая завершающего нулевого байта. В следующем примере, использующем приведенные функции, в массиве result будет образована строка "1 января 1998 года, 12 часов": char result[100];
char* date = "1 января 1998 года";
char* time = "12 часов";
strcpy(result, date);
strcat(result, ", ");
strcat(result, time); Как видно из этого примера, литералы можно непосредственно использовать в выражениях. Определить массив строк можно с помощью следующего объявления: char* StrArray[5] =
{ "one", "two", "three", "four", "five" };
|