Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Семинар 10. Строка как массив символов






Для корректной работы с русскими буквами подключите к проекту заголовочный файл < clocale> и в функции main() выполните инструкцию

setlocale(LC_ALL, " Russian");

Для работы с отдельными символами в языке используется целый тип char. Под данные этого типа отводится 1 байт. В величинах со знаком можно хранить значения от -128 до 127. При использовании unsigned значения могут быть от 0 до 255 (достаточно для хранения любого символа ASCII). Для работы с другими кодировками (Unicode) используется тип wchar_t (двухбайтовый).

Переменным типа char в качестве значения можно присваивать символьные константы. Значением переменной в этом случае будет код соответствующего символа.

Символьная константа представляет собой символ, заключенный в апострофы, например, 's'. Для представления специальных символов используются комбинации символов, начинающиеся с символа обратной косой черты. Ниже приведены некоторые часто встречающиеся символы:

\a – звуковой сигнал;

\n – перевод строки;

\r – возврат каретки;

\\ – обратная косая черта;

\' – апостроф;

\" – кавычка;

\? – вопросительный знак.

Обратная косая черта используется и в том случае, когда мы хотим представить символ с помощью его восьмеричного или шестнадцатеричного кода. Например, '\163', '\x73' и 's' – это одна и та же константа.

Текстовая (строковая) константа – это последовательность символов, заключенная в двойные кавычки. Специальные символы в этой последовательности представляются так же, как в символьной константе. При размещении текстовой константы в памяти транслятор автоматически добавляет в конец нулевой символ ('\0'), поэтому для хранения константы " s" потребуется памяти на 1 байт больше, чем для хранения 's'.

Функции стандартной библиотеки С++ для работы с символами находятся в заголовочном файле < cctype>. Основную их часть составляют функции, проверяющие принадлежность символа некоторому множеству. Аргументом функций является код символа, а возвращают они ненулевое значение (истина), если символ принадлежит нужному множеству, и ноль (ложь), если не принадлежит. Также в файле есть функции, переводящие символ из одного регистра в другой. Ниже перечислены некоторые функции из указанного файла:

isalpha – проверяет, является ли символ буквой;

isdigit – проверяет, является ли символ цифрой;

isprint – проверяет, является ли символ печатаемым;

ispunct – проверяет, является ли символ знаком пунктуации;

tolower – переводит символ латинского алфавита в нижний регистр;

toupper – переводит символ латинского алфавита в верхний регистр.

Пример 1. Работа с символами.

Напишем функцию, которая выведет на экран все символы (вместе с их кодами), которые функция isalpha считает буквой.

Функция перебирает все коды от 1 до 255 (символа с кодом ноль не существует), и для каждого кода вызывает isalpha. Обратите внимание на условие в заголовке цикла. Если написать заголовок for (ch=1; ch< =255; ch++){…}, то программа зациклится, так как после сложения 255 с единицей значение ch будет равно нулю, а для нуля условие выполняется.

Чтобы вывести на экран код символа, мы преобразовали ch к типу int. Чтобы вывести на экран символ, достаточно указать в инструкции вывода имя переменной типа char.

Результат работы функции зависит от того, выполняли ли вы функцию setlocale. Если нет, то на экран будут выведены только латинские буквы и их коды. В противном случае кроме латинских будут выведены русские и другие буквы (кириллица), которые есть в кодировке CP1251 Windows. Некоторые из них на экране могут быть отображены некорректно.

 

Строка С++ – это массив значений типа char. Последним символом строки должен быть символ с кодом ноль ('\0'). Доступ к элементам строки производится так же, как доступ к элементам любого одномерного массива. Примеры описания строк:

В том случае, когда при описании строка инициализируется, количество элементов в строке можно не указывать (S и S1), компилятор определит его сам. Проинициализировать строку можно текстовой константой (S) или набором символьных констант(S1). Если строка инициализируется символами (S1), то не забудьте про нулевой символ в конце. Для строки S3 выделяется 20 байт, но занято из них будет только 6 (5 символов и ноль в конце). Длина S3 равна 5, а не 20, так как фактическая длина строки определяется по положению нулевого символа. Фактическая длина строки всегда меньше длины массива, хотя бы на единицу.

Узнать длину строки можно с помощью функции strlen. Для определения количества элементов в массиве можно использовать операцию sizeof, которая предназначена для определения размера объекта или типа в байтах. Так как тип char занимает один байт, то размер массива в байтах равен количеству элементов массива. Выполнив приведенную ниже инструкцию, вы убедитесь, что значение sizeof равно 20, а значение strlen – 5.

Строку можно разместить и в динамической памяти, но в этом случае ее нельзя инициализировать текстовой константой:

Оператор

определяет указатель на текстовую константу, а не строку в динамической памяти, поэтому изменять такую строку нельзя (во время выполнения оператора p1[0] = 'h' возникнет ошибка).

Можно создать массивы строк:

Для доступа к отдельной строке используются квадратные скобки: M1[i] или M2[i]. Так, например, можно вывести на экран значения массива строк:

Операция присваивания для строк не определена, поэтому инструкции S2 = " Hello" является ошибочной, но можно ввести значение строки с клавиатуры, можно изменить его с помощью встроенных или собственных функций.

Пример 2 Изменение регистра символов строки.

Функция string_tolower преобразует все символы строки, переданной в качестве аргумента, к нижнему регистру. Преобразование выполняется с помощью стандартной функции tolower.

Пример 3 Ввод-вывод символов.

Для ввода символов воспользуемся операцией > >. В этом случае пробельные символы (пробел, табуляция, перевод строки) игнорируются. Ввод выполняется посимвольно. Введенные символы помещаются в строку buf. Ввод заканчивается, если введен символ точка или введено 79 непробельных символов.

При вводе – выводе русских букв в консоли возникают проблемы, так как по умолчанию в окне консоли используется кодировка cp866, а в программе мы выводим текст в кодировке Windows-1251. Коды русских букв у этих кодировок разные, поэтому и происходит искажение. Одно из возможных решений – преобразование введенной строки в нужную кодировку с помощью функции OemToCharA (заголовочный файл < windows.h>).

Чтобы ввести любые символы, включая пробельные, нужно воспользоваться методом get объекта cin. Вместо инструкции cin> > buf[i] используйте cin.get(buf[i]) или buf[i]=cin.get().

Пример 4 Ввод-вывод элементов массива строк.

Напишем функцию, которая сначала заполняет массив имен из трех элементов, а затем выводит его на экран. Длина каждого имени – не более 9 символов. Для ввода строки используется метод getline объекта cin.

Метод getline(S, n) считывает из входного потока n-1 символ или менее, если символ перевода строки встретится раньше. Символ перевода строки (\n) удаляется из входного потока, но не записывается в строковую переменную S. В S помещается завершающий нулевой символ.

Результат выполнения программы:

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

Функции стандартной библиотеки С++ для работы со строками находятся в заголовочном файле < cstring>. Ниже перечислены некоторые функции из указанного файла:

strlen(a) – возвращает длину строки (без нулевого символа). Пример использования функции:

strcpy_s(a, m, b) – копирует b в a и вставляет нулевой символ, m – максимальное количество элементов массива a. Пример использования функции:

strncpy_s(a, m, b, n) – копирует первые n символов строки b в a и вставляет нулевой символ, m – максимальное количество элементов массива a. Функция возвращает указатель на строку a. Пример использования функции:

strcat_s(a, m, b) – копирует b в конец строки a, m – максимальное количество элементов массива a. Перед копированием в строке a обязательно должен быть нулевой символ. Пример использования функции:

strncat_s(a, m, b, n) – копирует первые n символов b в конец строки a и вставляет нулевой символ, m – максимальное количество элементов массива a. Перед копированием в строке a обязательно должен быть нулевой символ. Функция возвращает указатель на строку a. Пример использования функции:

strtok_s(a, s, b) – разделяет строку a на подстроки, используя в качестве разделителей символы строки s. Функция возвращает указатель на первую подстроку или нуль, если символы-разделители не найдены. b используется для хранения позиции оставшейся части строки между вызовами. Чтобы получить следующие подстроки, при повторном вызове первый аргумент должен быть равен нулю. Пример использования функции:

strchr(s, c) – ищет символ c в строке s. Возвращает указатель на первое вхождение символа c в строку s. Если символа в строке нет, то возвращает NULL. В приведенном примере на экран выводятся остаток строки, начиная с найденного символа, номер символа в строке, значение символа:

strrchr(s, c) – ищет символ c в строке s. Возвращает указатель на последнее вхождение символа c в строку s. Если символа в строке нет, то возвращает NULL. Пример аналогичен примеру для функции strchr:

strpbrk(s, c) – ищет символы строки c в строке s. Возвращает указатель на первый найденный символ. Если символов в строке s нет, то возвращает NULL. Пример использования функции:

strcspn(s, c) – возвращает номер первого символа строки s, который совпадает с одним из символов строки c. Пример использования функции:

strspn(s, c) – возвращает номер первого символа строки s, который не совпадает ни с одним из символов строки c.

strstr(s1, s2) – ищет в строке s1 строку s2. Возвращает указатель на первое вхождение s2 в s1 или NULL в противном случае. Пример использования функции:

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

strcoll(s1, s2) – функция аналогична strcmp, но учитывает локальные настройки по алфавиту (например, правильно сравнивает букву ё). Пример использования функции:

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

atof(s) – преобразует s в double;

atoi(s) – преобразует s в int;

atoll(s) – преобразует s в long.

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.