Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

94

ния. Обычно признаком конца строки является точка. Принципиальной особенностью является переменная длина текстовых строк.

В языке С++ строка текста может быть представлена в одном из двух видов:

Строки, относящиеся к типу string, которые представляют собой класс, содержащий ряд функций и перегруженные знаки операций для работы со строками.

Стандартные строки языка С++, оканчивающиеся символом конца строки ('\0'). Такая строка может состоять из одного или нескольких слов или части слова.

Стандартные строки языка С++

Рассмотрим стандартные строки языка C++. В этом случае любая строка символов рассматривается как одномерный массив, каждый элемент которого содержит один символ. Разделители слов равноправны с любыми другими буквами, цифрами и знаками пунктуации. Поскольку строки символов являются массивами, то можно выполнять обработку строк с помощью индексов массивов, но более удобно для этой цели использовать указатели.

Принципиальной особенностью стандартных строк является наличие в конце символа конца строки. Это байт с шестнадцатеричным кодом 0x00, т.е. байт, состоящий из двоичных нулей, который в языке C++ записывается как '\0'; десятичный 0 как символ имеет шестнадцатеричный код 0x30. Массивы всех других типов в качестве последнего элемента могут иметь любое, разрешенное для данного типа данных значение.

Строковые константы всегда заключены в кавычки, даже если такая строка состоит из одного символа. Например:

"Введите два числа", "a + b", "!" и т.д.

Поскольку строки символов, в сущности, являются массивами, то никакие операции со стандартными строками (если их рассматривать как неделимое целое) не предусмотрены. Для этих целей не-

95

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

Для объявления стандартных строковых массивов в языке С++ применяется ключевые слова: char, wchar_t и TCHAR. С помощью ключевого слова char объявляют строковые массивы, в которых для каждого символа используется один байт (однобайтовая кодировка). Обычно кодировка соответствует кодовой таблице ASCII (для России это таблица 866). С помощью ключевого слова wchar_t объявляют строковые массивы в двухбайтовой кодировке (кодировка UNICODE). Атрибут TCHAR позволяет объявлять массивы, в которых может применяться как однобайтовая, так и двухбайтовая кодировка.

Строковые константы всегда заключены в кавычки, а символьные константы записываются в апострофах. Строковые константы нельзя присваивать именам переменных, а символьные константы (например, 'a', '1', '\0' и т.д.) можно.

Строковые константы могут задаваться при инициализации символьных массивов. Например:

char *st = {"Это строка символов"};

Это же присвоение значения может быть выполнено так: char st[20] = {"Это строка символов"};

При явном указании размерности символьного массива с одновременным присваиванием начального значение выдается сообщение об ошибке превышения размерности массива. Фигурные скобки можно опустить:

char st[] = "Это строка символов";

Можно так же присвоить значение строки символов символьному массиву с помощью операции ввода. Следует отметить, что для ввода с клавиатуры должна быть указана размерность строки, однако, превышение размера строки при вводе не проверяется, и, указав размер, например 1, можно ввести строку любой длины. Набираемую на клавиатуре строку при этом заключать в кавычки не требует-

96

ся. Но символ конца строки формируется при нажатии на клавишу ввода (Enter). Обычно ввод строки текста осуществляется до белого пробела, и текст разбивается на отдельные слова. О вводе строк текста, содержащих пробелы и другие разграничители см. параграф «Чтение файла в матрицу».

Кроме указанных способов возможно присвоение значения строки символов с помощью функций, выполняющих копирование (strcpy()), конкатенацию (сцепление) строк (strcat()) и др. Прямое присвоение или сцепление строк, объявленных с атрибутом char, в языке C++ не допускается.

Символ конца строки приписывается либо автоматически транслятором (на этот символ заменяется замыкающая строку кавычка), либо функциями, которые выполняют обработку строк, но не всегда при выполнении операций или при вызове функций к концу строки приписывается символ '\0'; его отсутствие на конце символа достаточно часто является причиной неправильной работы программ.

Распространенная операция, требуемая для обработки строк - это проход по строке, т.е. последовательное обращение к символам строки, пока не будет достигнут конец строки. Символ конца строки '\0', но компилятор и числовой нуль рассматривает как признак конца строки. Однако число 0 соответствует понятию "ложно", поэтому строки удобно обрабатывать с помощью оператора цикла while, в условии которого проверяют значение текущего символа. Цикл выполняется до тех пор, пока значение текущего символа не станет равным 0.

Строка символов это массив элементов типа char, а имя этого массива является указателем-константой, значение которого изменять нельзя. Поэтому для работы со строками используют рабочий указатель, который настраивают на требуемую позицию в строке (с которой начинается обработка). После этого проверяется значение текущего символа (на который в этот момент указывает рабочий указатель). Если значение этого символа не '\0' (не конец строки), с текущим символом выполняют требуемые действия, и значение ра-

97

бочего указателя увеличивают (чаще всего на 1), чтобы он стал настроенным на обработку следующего символа. Этот цикл обработки повторяют до конца строки.

Таким образом, типовая схема обработки строки символов имеет приведенный ниже вид.

#define SIZE 80

. . .

char st[SIZE], *pt; // Объявление строки и рабочего указателя

. . .

pt = st; // Настройка рабочего указателя на начало строки while(*pt != '\0')

{

<выполнение действий с текущим символом> pt++; // Приращение рабочего указателя

}

Поскольку признак конца строки соответствует понятию "ложно", то сравнение на неравенство нулю можно опустить: действительно, если значение символа не соответствует концу строки, то это не 0, а поэтому и условие "истинно", следовательно, такой цикл будет выполняться, пока не будет достигнут конец строки.

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

pt = st; while(*pt++)

{

<выполнение действий с текущим символом>

}

В этой типовой схеме обработки сначала проверяется значение текущего символа, и после этого наращивается указатель. Рассмотрим некоторые примеры обработки строк.

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