Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

111

}

cout << "count = " << count;

if(count != 0) cout << "\n Пары скобок совпадают"; else cout << "\n Пары скобок не совпадают";

_getch();

}

Строки типа string

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

Для объявления строк типа string требуется вставить директиву препроцессора #include <string> без расширения имени файла .h. (Если это расширение добавить к имени файла, то будет подключен файл старого языка Си). Память для строк этого типа выделяется автоматически.

Для типа данных string реализована функция getline, позволяющая считывать строки, которые могут содержать любые разграничители.

Втом числе можно считывать строки, состоящие из нескольких слов (разделенных пробелами), и даже абзацы. При вызове функции getline можно указать разграничитель строк. В этом случае строка считывается до разграничителя, но последний к строке не приписывается (удаляется из входного потока). Для того, чтобы получить стандартные строки языка С++ следует воспользоваться функциий c_str(), которая принудительно приписывает нулевой символ к концу строки.

Примечание: Если в функции getline указан разграничитель, отличный от конца строки (\n - этот разграничитель используется по умолчанию, и его можно не записывать), то символы конца строки оказываются внутри прочитанной строки (читается абзац), поэтому

112

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

С учетом изложенного считывание с клавиатуры строк, состоящих из слов, разделенных пробелами можно выполнить с помощью приведенного ниже фрагмента программы.

#include "stdafx.h" #include <string> #include <iostream>

// <Другие директивы препроцессора>

#define SIZE 80 using namespace std; void _tmain()

{

string str;

char stc[SIZE]; // Объявление стандартной строки языка С++ cout << “Введите строку из нескольких слов \n”;

getline (cin, str);// Чтение до нажатия на клавишу ENTER strcpy (stc, str.c_str()); // Копирование с преобразованием

. . .

}

В приведенном фрагменте программы функция getline считывает строку str типа string из файла cin (в данном случае это клавиатура). Во время копирования в стандартную строку языка С++ выполняется преобразование с помощью функции для получения строки с нулевым символом на конце. Ниже в таблице представлены основные операции, которые можно выполнять для строк разных типов.

Операция

 

Тип строки

 

 

 

char

wchar_t

string

 

 

 

 

 

Копирование

strcpy

wcscpy

=

 

 

 

 

Сцепление

strcat

wcscat

+

 

 

 

 

Сравнение

strcmp

wcscmp

<, ==, >, !=

 

 

 

 

Длина строки

strlen

wcslen

str.length

Примечание: Для строк типа string кроме приведенных в таблице перегруженных знаков операций имеется много функций, для

113

доступа к которым требуется после имени объявленной строки поставить точку и выбрать из появившегося списка требуемую функцию.

Массивы указателей

Массивы указателей позволяют объявить группу связанных друг с другом строк переменной длины. Именно этим массивы указателей отличаются от матриц, длина строк у которых одинакова. Таким образом, массив указателей является двумерным массивом с переменной длиной строк. При объявлении массива указателей может быть указано количество строк. Например, запись

char *st[6];

объявляет массив указателей, состоящий из 6 строк. Каждая строка имеет переменную длину и должна оканчиваться символом конца строки ('\0'). Физически внутри компьютера массив указателей организован в виде одной области памяти, разбитой на отдельные строки.

Строки массива указателей размещаются в памяти последовательно друг за другом, а каждый из указателей из массива указателей связан с началом своей строки. Отсюда следует, что если объявление массива указателей совмещено с его инициализацией, то никаких трудностей не возникает. Если же объявлен массив указателей, а входящие в него строки будут определены позднее, то для каждой новой строки память должна выделяться индивидуально.

Если в объявленном массиве указателей с выделенной памятью для всех отдельных строк вставить букву в какую либо строку, то произойдет искажение последующих строк (поскольку они все следуют в памяти друг за другом). По этой причине массив указателей не следует применять, если предполагается редактирование строк.

Объявление массива указателей в чем-то схоже с объявлением матриц, и, наверное, можно было бы и не вводить такое понятие. Различие состоит в том, что для массива указателей выделяется столько памяти, сколько необходимо в данном конкретном случае с учетом переменной длины строк, а при использовании матрицы

114

длины всех строк будут одинаковы, т.е. память для строк текста должна выделяться с запасом для размещения самой длинной строки.

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

Пример. Пусть имеется массив указателей следующего вида:

char *month[ ] = {“Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль","Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};

Отдельные элементы этого массива указателей имеют значения: month[0] соответствует значению "Январь"

month[1] соответствует значению "Февраль" и т.д.

Ниже приведена программа, иллюстрирующая использование массива указателей. Каждый указатель этого массива связан со строкой, содержащей названия цифр. В программу вводится цифра. Эта цифра рассматривается как индекс массива указателей. Программа по введенному индексу выбирает из массива соответствующую строку и выводит ее на экран как текстовое название введенной цифры.

// Вывод названия цифры после ввода ее с клавиатуры.

#include "stdafx.h" #include <string> #include <conio.h> #include <iostream> using namespace std; char *number[10] =

{"Нуль","Один","Два","Три","Четыре","Пять", "Шесть", "Семь","Восемь","Девять"};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]