Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 10 Символы и строки.doc
Скачиваний:
52
Добавлен:
29.02.2016
Размер:
166.4 Кб
Скачать

Строки Строки как массивы символов

В языке С++ отсутствует специальный строковый тип данных. Переменная типа char предназначена для хранения кода отдельного символа, но не строки. В С++ строки рассматриваются как массивы символов, оканчивающиеся нуль-символом ('\0'). При определении длины символьного массива необходимо учитывать признак её завершения и задавать длину на единицу больше длины самой большой строки из тех, которые предполагается хранить в этом массиве.

Строка – это массив символов, который завершается нулевым символом ('\0').

Например, объявляя массив str для хранения строки из пяти символов, следует использовать следующий оператор объявления:

char str[6];

Символьный массив для хранения строки можно объявить с присваиванием ему сразу начального значения (проинициализировать):

char str[6] = "HELLO";

char str[6] = {'H', 'E', 'L', 'L', 'O', '\0'};

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

Если при объявлении массива его элементам присваиваются начальные значения, указывать размер массива в скобках не обязательно:

char str[] ="HELLO";

Язык С++ позволяет определять строковые константы (литералы). Вспомним, что строковая константа – это последовательность символов таблицы кодов ASCII, заключенная в двойные кавычки, например, "HELLO", "abcd", . "" (см. главу 3).

Строка, приведённая последней (""), называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.

Следует различать символ и строку, состоящую из одного символа, например: 'a' и "a" (в памяти символ займёт 1 байт, а строка – два байта).

Ввод строк с клавиатуры можно выполнить операцией >>, используя стандартный поток ввода cin:

char str1[20], str2[20];

cin>>str1>>str2;

В этом случае извлечение символов происходит до ближайшего пробела (вместо него в строку заносится нулевой символ – '\0').

В данном случае, если с клавиатуры вводится строка "111 2222 33", переменные str1 и str2 примут значения "111" и "2222" соответственно, а остаток строки воспринят не будет.

Для решения этой проблемы для ввода строк можно использовать функцию gets(), общий формат вызова которой имеет вид:

gets(имя_массива);

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

Для вывода строки на экран можно использовать стандартный поток вывода cout, указав в операции << имя символьного массива (вместо привычной строковой константы).

Для вывода строки рекомендуется использовать функцию puts(str); где str – имя символьного массива. Символ '\0' в конце строки преобразуется в символ новой строки, т.е. после выполнения этой функции (а не перед выполнением) происходит переход на новую строку.

// Пример 10.2. Объявление, ввод и вывод строки. Определение длины.

// строки. Заполнение строки случайными символами.

#include <iostream>

#include <cstring>

using namespace std;

const int LEN = 80; // максимальная длина строки

int main(){

char str[LEN]; int i, k, dl;

cout<<"\nVvedi stroku: "; gets(str); // вводим 111 2222

cout<<"str = "<<str<<endl; // str = 111 2222

cout<<"str = "; puts(str); // str = 111 2222

for(i = 0; str[i]; i++); // длина строки

cout<<"dlina = "<<i<<endl;

dl = strlen(str); // выч. длины строки, используя strlen()

cout<<"dlina = "<<dl<<endl;

srand(dl);

char st[15]; // заполнение строки случайными символами

for(int j = 0; j < 15; j++){

k = rand() % 96 + 32; st[j] = char(k);

}

st[14] = '\0'; cout<<"st = "<<st<<endl;

system("pause");

}

Так как строки представляют собой массивы, а имя массива, как мы знаем, есть константный указатель, операции присваивания, сложения и т.д. над строками не допустимы. Например:

char str[10]; str = "Hello"; // нельзя

char str1[10], str2[10] = "ffff"; str1 = str2; // нельзя

Доступ к элементам символьного массива осуществляется так же, как доступ к элементам любого массива:

char c = str[2]; // переменная c будет содержать третий

// символ строки (счёт идёт с нуля)

// Пример 10.3. Поиск в строке максимальной длины подстроки,

// состоящей из звёздочек.

#include <iostream>

using namespace std;

const int M = 50;

int main(){

char str[M]; int max, k;

cout<<"Vvedi stroku"<<endl; gets(str);

cout<<"isxodnaya stroka: "<<str<<endl;

max = 0; k = 0;

for(int i = 0; str[i]; i++)

if(str[i] == '*'){k++; if(k > max) max = k;}

else k = 0;

cout<<"max ZVEZD== "<<max<<endl;

system("pause");

}