Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Оператор




Работа со строковыми данными

 

Строка представляет собой массив символов, заканчивающийся нуль-символом. Нуль-символ — это символ с кодом, равным 0, что записывается в виде управ­ляющей последовательности '\0'. По положению нуль-символа определяется фактическая длина строки. Строку можно инициализировать строковым литера­лом:

 

char str[10] = "Vasla";

// выделено 10 элементов с номерами от 0 до 9

// первые элементы - 'V. 'a', 's'. 'i'. 'а', '\0'

 

В этом примере под строку выделяется 10 байт, 5 из которых занято под символы строки, а шестой — под нуль-символ. Если строка при определении инициализи­руется, ее размерность можно опускать (компилятор сам выделит соответствую­щее количество байт):

char str[] = "Vasla"; // выделено и заполнено 6 байт

char *str = "Vasla";

создает не строковую переменную, а указатель на строковую константу, изме­нить которую невозможно (к примеру, оператор str[l]='o' не допускается). Знак равенства перед строковым литералом означает инициализацию, а не присваива­ние. Операция присваивания одной строки другой не определена (поскольку строка является массивом) и может выполняться с помощью цикла или функций стандартной библиотеки. Библиотека предоставляет возможности копирования, сравнения, объединения строк, поиска подстроки, определения длины строки и т. д. (возможности библиотеки описаны в разделе «Функции работы со строка­ми и символами», с. 91, и в приложении 6), а также содержит специальные функ­ции ввода строк и отдельных символов с клавиатуры и из файла.

Пример. Программа запрашивает пароль не более трех раз.

 

#include <stdio.h>

# include <string.h>

int main(){

char s[80], passw[] = "kuku"; // passw - эталонный пароль.

// Можно описать как *passw = "kuku";

Int i. k = 0;

for (1 = 0;!k && i<3; i++){

printf("\nвведите пароль:\n");

gets(s); // функция ввода строки

if (strstr(s,passw))k = 1; // функция сравнения строк

}

if (k) printf("\nпароль принят");

else printf("\nпароль не принят");

return 0:

}

 

При работе со строками часто используются указатели.

 

ВНИМАНИЕ Распространенные ошибки при работе со строками — отсутствие нуль-символа и выход указателя при просмотре строки за ее пределы.

 

Рассмотрим процесс копирования строки src в строку dest. Очевидный алгоритм имеет вид:

 

char src[10], dest [10];

for (int i = 0; i<=strlen(src); i++) dest[i] = src[i];

 

Длина строки определяется с помощью функции strlen, которая вычисляет длину, выполняя поиск нуль-символа. Таким образом, строка фактически про­сматривается дважды. Более эффективным будет использовать проверку на нуль-символ непосредственно в программе. Увеличение индекса можно заме­нить инкрементом указателей (для этого память под строку src должна выде­ляться динамически, а также требуется определить дополнительный указатель и инициализировать его адресом начала строки dest):

 

 

#indude <iostream.h>

int main(){

char *src = new char [10];

char *dest = new char [10], *d = dest;

cin» src:

while (*src!= 0) *d++ = *src++;

*d = 0; // завершающий нуль

cout «dest:

return 0;

}

В цикле производится посимвольное присваивание элементов строк с одновре­менной инкрементацией указателей. Результат операции присваивания — пере­даваемое значение, которое, собственно, и проверяется в условии цикла, поэтому можно поставить присваивание на место условия, а проверку на неравенство нулю опустить (при этом завершающий нуль копируется в цикле, и отдельного оператора для его присваивания не требуется). В результате цикл копирования строки принимает вид:

while (*d++ = *src++);

Оба способа работы со строками (через массивы или указатели) приемлемы и имеют свои плюсы и минусы, но в общем случае лучше не изобретать велосипед, а пользоваться функциями библиотеки или определенным в стандартной биб­лиотеке C++ классом string, который обеспечивает индексацию, присваивание, сравнение, добавление, объединение строк и поиск подстрок, а также преобразо­вание из С-строк, то есть массивов типа char, в string, и наоборот.

ПРИМЕЧАНИЕ -

Строки string не обязательно должны состоять из символов типа char. Это позволяет ис­пользовать любой набор символов (не только ASCII), но для произвольного набора следу­ет определить собственную операцию копирования, что может снизить эффективность работы.

 




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 308; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.