Строка как массив переменных типа CHAR

Первый из них - это массив переменных типа char.

Второй из вариантов, более удобный - это специальный класс string

Строка представляет собой набор символов. Все строки, которые до сих пор использовались нами в программах, представляли собой безымянные строковые константы – строковые литералы. Строковый литерал представляет собой последовательность символов, заключенную в двойные кавычки. Пример:

cout<<"Здравствуй, мир!"

Основное свойство строкового литерала — простота его использования. Не имея ни малейшего представления о том, чем он является на самом деле, мы можем использовать его практически везде, где от нас ждут строку.

Если кто не помнит, то переменная типа char хранит в себе 1 символ. Размер такой строки равняется размеру массива - 1, т.к. последний элемент содержит NULL (пустая переменная без значения), который обозначает символ конца строки.

Например:

char name[50];

cin>>name;

cout<<"Hello "<<name<<endl;

Проиллюстрирую создание строк на фрагментах кода с комментариями.

char str1[10];

/* Строка - массив из 10 символов. Начальное значение символов не определено*/

char str2[10]="Hello";

/* Используется инициализация (не присваивание!). В первые 5 символов записывается “Hello”, в 6 – нуль-терминатор, значение трех последних не определено */

char str3[10]={'H', 'e', 'l', 'l', 'o', '\0'};

//Эквивалентно предыдущему.

char str4[10]="Very long line";

/*Ошибка. Массив из 10 элементов нельзя инициировать более длинной последовательностью */

char str5[]="Very long line";

/*Компилятор автоматически определяет длину массива (в нашем случае 15) и инициализирует его последовательностью символов */

#include <iostream>

using namespace std;

int main()

{

//Подсчитать количество символов с строке

char stroka[20];

cout <<"Vvedite stroku dlinoi <=19";

cin>>stroka;

int kol=0; int i=0;

while (stroka[i]!='\0') {kol++; i++;}

cout<<kol;

return 0;

}

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

Присвоить значение строке с помощью оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации.

 

void main()

{

char s1[10]="string1";

int k=sizeof(s1);

cout<<s1<<"\t"<<k<<endl;

char s2[]="string2";

k=sizeof(s2);

cout<<s2<<"\t"<<k<<endl;

char s3[]={‘s’,’t’,’r’,’i’,’n’,’g’,’3’}

k=sizeof(s3);

cout<<s3<<"\t"<<k<<endl;

char *s4="string4";//указатель на строку, ее нельзя изменить

k=sizeof(s4);

cout<<s4<<"\t"<<k<<endl;

 

}

Кроме того: оператор cin воспринимает пробел как конец строки (те невозможно вводить предложения). Можно исправить эту программу следующим образом:

#include <iostream>

using namespace std;

int main()

{

//Подсчитать количество символов в строке

char stroka[20];

cout <<"Vvedite stroku dlinoi <=19: ";

cin.get(stroka,19);

cout<<stroka;

int kol=0; int i=0;

while (stroka[i]!='\0') {kol++; i++;}

cout<<kol;

return 0;

}

На языке C++ программист должен постоянно проверять, не произошло ли переполнение строки при различных операциях типа копирования или считывания строки со стандартного ввода или из файла. Кроме того, для копирования строк необходимо было вызывать специальную функцию strcpy. Поэтому в C++ были добавлены новые строки: объекты класса string. Для этих объектов определен оператор конкатенации +, оператор присваивания = и при работе с таким строками автоматически проходит проверка переполнения строки и увеличение ее размера при необходимости.

Также неудобно в дальнейшем работать со строками: искать подстроку в строке, скопировать одну строку в другую и т.д. Поэтому переходим ко второму варианту работы со строками в С++.