КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Строки как массив элементов типа char
В Cи отсутствует специальный тип строк. Строки рассматриваются как массивы символов, оканчивающиеся нулевым символом ('\0'). Строка доступна через указатель на первый символ в строке. Значением строки является адрес ее первого символа. Таким образом, можно сказать, что в Cи строка является указателем - указателем на первый символ строки. В этом смысле строки подобны массивам, потому что массив тоже является указателем на свой первый элемент (рисунок 8.1).
Рисунок 8.1 – Представление массива элементов в памяти ЭВМ В приведенном примере объявлен символьный массив A на 5 элементов: char A[]=”Вася”; Обратите внимание на то, что теперь под хранение каждого символа выделяется один байт памяти, а под указатель будет по-прежнему выделено 4 байта. Необходимо отметить, что в приведенном примере размер массива не указан, он определен автоматически по длине строки-инициализатора, причем, автоматически добавлен символ окончания строки. Строка может быть объявлена либо как массив символов, либо как переменная типа char*. Каждое из двух приведенных ниже эквивалентных объявлений char S[] = "строка"; char *Sp = "строка"; присваивает строковой переменной начальное значение "строка". Первое объявление создает массив из 7 элементов S содержащий символы 'с', 'т', 'р', 'о', 'к', 'а' и '\0'. Второе объявление создает переменную указатель Sp, который указывает на строку с текстом " строка ", лежащую где-то в памяти. Но в любом случае число хранимых символов на 1 больше числа значащих символов за счет оконечного нулевого символа. Доступ к отдельным символам строки осуществляется по индексам, начинающимся с нуля. Например, S[0] и Sp[0] - первые символы объявленных выше строк, S[1] и Sp[1] - вторые и т.д. В приведенных объявлениях длина строк определялась автоматически компилятором. Можно объявлять строковые переменные заданной длины. Например, оператор char buff[100]; объявляет переменную buff, которая может содержать строку до 99 значащих символов плюс заключительный нулевой символ. Теперь приступим к знакомству с наиболее полезным применением символьных указателей: запоминанию массивов строк. На самом деле нельзя создать массив строк, но можно запомнить массив символьных указателей, каждый из которых содержит адрес строки в памяти. Определением массива символьных указателей создается динамический массив. Этот массив похож на двумерную таблицу с одним исключением: все строки в этом массиве могут иметь разную длину (разное количество символов в строке). Все двумерные таблицы, которые рассматривались ранее, выровнены с обеих сторон. Например, объявим символьную таблицу с 5 строками и 10 колонками, каждая строка которой содержит одинаковое число символов. Ее можно определить следующим образом: char names [ 5 ] [ 10 ] = { { "Сергей" }, { "Михаил" }, { "Николай" }, { "Иван" }, { "Алексей" }}; Она показана на рисунке 8.2. Обратите внимание, в таблице много пробелов. Каждая строка занимает 10 символов даже в том случае, когда символов в строке намного меньше. Незаполненные элементы содержат символ ограничитель строки, потому что Cи записывает этот символ во все неинициализированные вами элементы массива. Этот тип таблиц занимает слишком много места в памяти.
Рисунок 8.2 – Пример двумерного символьного массива строк Для устранения проблемы нерационального использования памяти объявим одномерный массив символьных указателей. Каждый указатель содержит адрес сроки в памяти, и эти строки могут иметь разную длину. Вот примеры определения таких массивов: char *names [ 5 ] = { { "Сергей" }, { "Михаил" }, { "Николай" }, { "Иван" }, { "Алексей" } }; или просто char *names [ ] = { { "Сергей" }, { "Михаил" }, { "Николай" }, { "Иван" }, { "Алексей" } }; Это одномерные массивы. Хотя раньше ничего подобного не рассматривалось, не следует смущаться. Звездочка перед names говорит о том, что это массив указателей. Указатели имеют символьный тип. Строки не присваиваются элементам массива, но в массиве содержатся адреса этих строк. На рисунке 8.3 показан этот массив указателей. Строки могут находиться в любом месте памяти. Их местоположение не существенно, так как каждый указатель содержит адрес первого элемента соответствующей строки. Строки не занимают лишнюю память; каждая строка использует ровно столько пространства, сколько нужно для ее размещения и символа ограничителя строки. Такая структура содержит данные в форме с рваными краями.
Рисунок 8.3 – Массив указателей Для вывода первой строки можно использовать оператор cout: cout «*names; // Печать Сергей Для вывода второй строки используется следующий оператор cout: cout *(names+1); // Печать Михаил При обращении к элементу массива при помощи оператора *, получаем доступ к одной из строк массива. Можно использовать возвращаемое этим оператором значение везде, где можно использовать строковую константу или символьный массив. Очень часто при работе с символьными массивами возникает задача их обработки (сравнение строк, объединение строк, поиск подстроки в строке и так далее). В заголовочном файле <string.h> описано множество функций для работы со строками. Например, функции: · копирования строк (strcpy, strncpy); · сравнения строк (strcmp, strncmp); · объединения строк (strcat, strncat); · поиска подстроки (strstr); · поиска вхождения символа (strchr, strrchr, strpbrk); · определения длины строки (strlen); · преобразования строки в число (atoi, atoll, atof); · и так далее. Учитывая, что строки состоят из символов, полезно знать некоторые функции работы с символами. Для работы с символами служит библиотека ctype (заголовочный файл ctype.h). Она содержит: 1. Функции проверки на принадлежность символа множеству: · isalmum(c) – букв и цифр (A-Z, a-z, 0-9); · isalfa(c) – букв (A-Z, a-z); · iscntrl(c) – управляющих символов (с кодами 0…31 и 127); · isdigit(c) – цифр (0-9); · isgraph(c) – печатаемых символов кроме пробела; · islower(c) – букв нижнего регистра (a-z); · isprint(c) – печатаемых символов; · ispunct(c) – знаков пунктуации; · isspace(c) – символов-разделителей; · isupper(c) – букв верхнего регистра (A-Z); · isxdigit(c)- шестнадцатеричных цифр. 2. Функции преобразования символов: · tolower(c) -к нижнему регистру; · toupper(c) – к верхнему регистру.
Лабораторная работа № 12 ЦЕЛЬ РАБОТЫ: •получение начальных навыков в объявлении, инициализации, использовании символьных массивов и в обработке строк на С++. Выполнение работы: освоить теоретический материал, выполнить общее для всех задание I и в соответствии с вариантом составить программу (задание II). Задание I Используя
Дата добавления: 2014-11-16; Просмотров: 2727; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |