HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » c++ |
Очень часто, на практике, приходится сталкиваться с задачами, которые сводятся к работе над строками. Вы уже знаете, что язык С++ не поддерживает отдельный строковый тип данных. Таким образом, можно определить строки двумя способами: как массив символов или как указатель на первый символ строки, например: char str1[10] = "string1"; // объявление строки с помощью массива символов Итак, теперь подробнее. Вы уже знаете, что массив - это набор однородных значений. Так вот строка есть не что иное, как набор символов, и, соответственно, для хранения строк можно использовать символьные массивы. Например, строка "QWERTY" имет тип char[7], а пустая строка "" имеет тип char[1]. Почему char[1]? Именно потому, что любая строка завершается так называемым нулевым символом, то есть символом, код которого в ASCII-таблице равен 0 (этот символ также является escape-символом и его символьный эквивалент представляется как '\0'). Благодаря этому свойству Вы всегда можете определить конец строки, если у Вас строка занимает меньшее количество символов, чем то количество, которое было указано в квадратных скобках при оъявлении массива, т.е. определить фактическую длину строки, хранящейся в массиве. Одна из замечательных особенностей при работе со строками - это возможность упрощенной начальной инициализации. Например, Объявление char str[] = "ABCDE"; присваивает переменной-строке начальное значение "ABCDE". А точнее, создает массив из 6 символов: 'A','B','C','D','E' и символа '\0'. Как видите начальная инициализация символьного массива действительно отличается от инициализации какого-либо другого массива - можно просто присвоить необходимую строку имени массива с пустыми квадратными скобками. С++ сам подсчитает длину строки и выделит соответствующий объем памяти под массив для размещения в нем требуемой строки. Сразу необходимо отметить, что С++ сам автоматически сделает последний элемент массива нулевым символом (а Вы уже помните, что любая строка обязательно заканчивается нулевым символом), то есть, хотя в данном случае Вы массиву str присваиваете строку "ABCDE", длина которой составляет 5 символов, C++ выделяет память под 6 символов, записывает туда строку и затем в последний (пятый при счете от 0) записывает нулевой символ. Следует также отметить, что при начальной инициализации символьного массива (как и любого другого) можно указывать в квадратных скобках его размер с целью дальнейшего использования массива еще для каких-либо целей (например, для хранения другой какой-либо строки): Объявление char str[10] = "ABCDE"; создает массив из 10 символов и первые пять элементов этого массива принимают значения 'A','B','C','D' и 'E' соответственно, остальные символы будут ноль-символы. В данном случае в первые 5 элементов массива записывается строка "ABCDE", а всем остальным элементам присваиваются нули. Для начальной инициализации символьного массива можно использовать правила инициализации произвольного массива, то есть используя фигурные скобки, только в данном случае придется явно указывать нулевой символ, которым заканчивается строка. Давайте рассмотрим предшествующий пример с использованием общих правил начальной инициализации массива. char str[]={'A','B','C','D','E','\0'}; Как видите упрощеный вариант начальной инициализации строкового массива значительно проще и удобнее, но еще раз отметим, что его можно использовать только для символьных массивов. Типичная ошибка программирования. Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку. Типичная ошибка программирования. Создание или использование "строки", которая не содержит завершающего нулевого символа. Типичная ошибка программирования. Путают символьные и строковые константы. Символьная константа - это один символ, заключенный в апострофы, например: 'A' или '\n'. Строковая константа - это последовательность символов, заключенная в двойные кавычки. В числе символов строки могут находится любые символьные константы, например, "Visual C++\n" состоит из следующих символов: 'V', 'i', 's', 'u', 'a', 'l', ' ', 'C', '+', '+', '\n', '\0'. Таким образом, "A" - это строковая константа и состоит из двух символов: 'A' и '\0'. Соседние строковые константы транслятором "склеиваются", например: "АБВ" "ГДЕ" означает то же, что "АБВГДЕ". Рассмотрим небольшой пример: //Задана строка, скопировать ее в символьный массив. #include<iostream.h> void main() { char str1 [ ] = "1234567890", /* объявляем символьный массив str1 и инициализируем его */ str2[11]; // объявляем символьный массив без инициализации /* в цикле пока не встретится конец строки присваиваем текущему элементу массива str2 символ из массива str1 */ for(int i = 0; str1[i] != '\0'; i++) str2[i] = str1[i]; // копируем ноль-символ в str2. str2 [i] = '\0'; cout << str2 << '\n'; // вывод строки на экран } Обратите внимание, выход из цикла происходит, когда str1[i] равно ноль-символу, т.е. ноль-символ не копируется в str2, следовательно это нужно сделать за циклом. Еще одна особенность работы с символьными массивами - если элементы произвольного массива можно вводить с клавиатура и выводить на экран только по одному элементу в цикле, то в символьный массив можно ввести сразу всю строку, используя оператор ввода cin >> Имя_массива;и, аналогичным образом, вывести сразу всю строку на экран, используя оператор вывода cout << Имя_массива;Следует сразу отметить, что при вводе с клавиатуры строки оператор cin автоматически добавляет в конец строки нулевой символ, так что Вы должны учитывать этот факт при указании количества элементов при объявлении массива. Например, #include <iostream.h> void main() { char str[31]; // объявление символьного массива cout<<"Enter a string (max 30 symbols):"; cin>>str; // ввод строки cout<<"\nYou enter string:"<<str; // вывод строки } Как видите в данном примере выделяется память под 31 символ, но пользователю в приглашении указывается, что он может ввести строку с размером максимум 30 символов, учитывая тот факт, что оператор cin добавит еще один нулевой символ в конец строки автоматически, и под него также необходимо предусмотреть выделение памяти. Далее после приглашения вводим сразу всю строку с клавиатуры в массив и затем с соответствующим сообщением выводим всю строку на экран монитора. Второй способ определения строки - это использование указателя на символ. Объявление char *b;задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Сделать это можно, например, присвоив b указатель на уже существующий символьный массив, или динамически выделить память под новый массив. Например, #include<iostream.h> void main() { char str[] = "Здравствуй, мир!"; // объявляем символьный массив char *b; // объявляем указатель на символ b = &str[12]; // теперь b указывает на 12-ый символ str *b = 'M'; // присваиваем первому элементу b символ 'М' cout << b; // выводим строку b на экран (Мир!) }Пример с динамическим выделением памяти под строку смотрите в разделе "Работа со строками. Примеры", пример 3. Итак, подведем итоги.
| ||
Просмотров: 23740 | Комментарии: 6 | Рейтинг: 4.3/7 |
Всего комментариев: 6 | ||||||
| ||||||