Строки Строки как массивы символов
В языке С++ отсутствует специальный строковый тип данных. Переменная типа 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");
}