Студопедия

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

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

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






Описание строк






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

Строка представляет собой массив символов, заканчивающийся нуль-символом’\0’. В С++ есть две возможности работы со строками: функции, унаследованные из библиотеки С (заголовочный файл < string.h> или < cstring>), и библиотечный класс С++ string, предоставляющий более широкие возможности представления, обработки и контроля строк. Класс string более безопасен, чем С-строки, но и более ресурсоемок. Для его грамотного использования требуется знание основ объекто-ориентированого программирования, поэтому мы рассмотрим его позже, а сейчас ограничимся строками С.

Описание строк

Память под строки, как и под другие массивы, может выделятся как компилятором, так и непосредственно в программе(динамически). Длина динамической строки может задаваться выражением, длина не динамической строки только - константным выражением. Чаще всего используют частный случай константного выражения – именованную константу.

const int len_str=80;

char str[len_str];

при задании длины необходимо учитывать завершающий нуль-символ. Например, в приведенной выше строке можно хранить не 80 символов, а только 79. При описании можно инициализировать строку строковой константной(нуль-символ, следующий за последним символом, формируется автоматически):

char a[100]=”Пример стороки”;

Если строка инициализируется, её размерность можно опускать – компилятор сам выделит память, достаточную для размещения всех символов строки и завершающего символа:

char a[]=”Пример стороки”;

Для размешения строки в динамической памяти надо описать указатель на char, а затем выделить память с помощью new или malloc:

char *p = new char[m];

char *q = (char *)malloc(m*sizeof(char));

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

char *str =”Пример константной строки”;

Присваивание вида str[2]='w' для такого указателя, хотя и компилируются, могут вызывать ошибки времени выполнения.

Для ввода вывода используются известные функции scanf и printf, задав спецификацию формата %s:

char s[10];

scanf(“%s”, s); printf(“%s”, s);

Имя строки, как и имя любого массива, является указателем на его начало, поэтому операция взятия адреса(&) опущена. Ввод будет выполнятся до первого пробельного символа(пробела, знака табуляции или символа перевода строки): если ввести несколько слов, воспринимается только первое. Чтобы ввести строку, состоящую из нескольких слов, используется спецификация %c(символы) с указанием максимального количества вводимых символов, например scanf(“%10c”, s).(ожидает все 10 символов)

Количество символов может быть только целой константой. При выводе можно задать перед спецификацией %s количество позиций отводимых под строку: printf(“%15s”, s). строка при этом выравнивается по правому краю отведенного поля. Если заданного количества недостаточно для размешения строки, оно игнорируется, и строка выводится целиком.

Библиотека содержит функции gets и puts, специально предназначенные для ввода-вывода строк.

gets(s); puts(s);

Функция gets(s) читает символы с клавиатуры до появления символа новой строки и помещает их в строку s(сам символ новой строки в строку не включается, вместо него в строку заносится нуль символ). Функция возвращает указатель на строку s, а в случае возникновения ошибки или конца файла – NULL.

Функция put(s) выводит строку s на стандартное устройство вывода, заменяя значащий ноль символом новой строки. Возвращает неотрицательное число в случае успеха или EOF при ошибке.

Функциями семейства printf удобнее пользоваться в том случае, если в одном операторе требуется ввести или вывести данные различных типов. Если же работа выполняется только со строками, проще применять специальные функции для ввода вывод строк gets и puts.

Cледующая программа присваивает буквы от А до Z переменной alphabet, используя цикл for. Затем программа добавляет символ NULL в эту переменную и выводит ее с помощью cout.

char alphabet [27]; // 26 буквы плюс NULL char letter;

int index=0;

for (char letter = 'A'; letter < = 'Z'; letter++, index++)

alphabet[index] = letter;

alphabet[index] = '\0';

printf(" Bukva %s", alphabet);

При рассмотрении программ на C++ вы можете встретить символы, заключенные в одинарные кавычки (например, 'А') и символы, заключенные в двойные кавычки (" А"). Символ внутри одинарных кавычек представляет собой символьную константу. Компилятор C++ выделяет только один байт памяти для хранения символьной константы. Однако символ в двойных кавычках представляет собой строковую константу — указанный символ и символ NULL (добавляемый компилятором). Таким образом, компилятор будет выделять два байта для символьной строки.

Передача символьной строки в функцию подобна передаче любого массива в качестве параметра. Внутри прототипа функции вам нужно просто указать тип массива (char) и левую и правую скобки массива. Вам не надо указывать размер строки. Например, следующая программа использует функцию len_ string для нахождения длины символьной строки:

int len_string(char string[]){

int i;

for(i=0; string[i]! =0; i++);

return i;

}

void main(void){

cout< < len_string(" Привет, C++! ");

cout< < len_string(" Учусь программировать на C++");

}

Как видите, функция len_string трактует параметр символьной строки как массив:

int len_string(char string[])

Так как символ NULL указывает конец строки, функция не требует параметр, который задает количество элементов в массиве. Вместо этого функция может определить последний элемент, просто найдя в массиве символ NULL.

 






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