Общая характеристика строк

Язык С++ не содержит специального встроенного в язык строкового типа, как это имело место, например, в языке Pascal. Термин “строка” имеет два значения.

Во-первых, в смысле языка С строка рассматривается как массив символов произвольной длины, оканчивающийся нулевым символом (нуль-символом, нуль-терминатором, NULL -символом), ASCII код которого равен нулю. В тексте программы он обозначается как ‘\0’. Для работы с такими строками есть большое количество разнообразных самостоятельных функций, не включённых в классы (см. 6.3). Их прототипы находятся в заголовочном файле string.h. В этом параграфе рассматриваются такие строки и соответствующие методы программирования, основанные на использовании указателей при работе с массивами (см.§3). Заметим, что навыки работы с указателями для организации циклов и нужны, прежде всего, для того, чтобы можно было с успехом использовать встроенные строковые функции. В противном случае непростые задачи ещё более усложняются, если программировать то, что запрограммировано в таких функциях.

Во-вторых, строку можно рассматривать в смысле языка. С++ как объект стандартного класса String. Методы и другие средства этого класса автоматизируют работу со строками. В превосходном учебном пособии по С++ [ ] приведены несколько доводов в пользу включения в язык С++ стандартного класса String. Но в то же время здесь же подчёркивается, что ни в коем случае нельзя отказываться от обычных, оканчивающихся нулём строк как массивов символов. Они остаются наиболее эффективным способом реализации символьных строк. Использование возможностей класса String будет рассмотрено на втором курсе после подробного изучения объектно-ориентированного программирования.

Строку можно объявить и инициализировать без явного использования указателей, как статический одномерный массив символов. При этом необходимо указать размерность, достаточную для размещения текста и символа конца строки (‘\0’). Этот символ надо явно записать в конце списка символов, например:

char T[11]={‘м’,’а’,’т’,’е’,’м’,’а’,’т’,’и’,’к’,’а’,’\0’};

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

char T[11]=“математика”;.

В этом и других случаях нулевой символ в конце строковой константы записывать не надо, он добавляется компилятором автоматически. Если для строки не указана размерность, она будет определена в зависимости от её длины. Например,

сhar Fak[]=”ММФ”;

инициализирует строку из четырёх символов, так как добавляется символ конца строки.

Этот символ конца строки, как и число “нуль”, играет роль false в операторах сравнения типа

if (Fak[i]) …;

То есть, если i -й символ не является символом ‘\0’, то получается true, в противном случае — false. Поэтому вышеприведённая запись равносильна

if (Fak[i]!=’\0’)…;

Наиболее профессиональный способ объявления строки такой:

char *s;.

Объявляем переменную-указатель, которая будет содержать адрес начала строки. Перед первым использованием надо обязательно определить значение переменной указателя s. Это можно сделать по общим правилам одним из следующих способов:

a) для этого можно использовать ранее определённую статическую строку: s=Fak;

b) используем определённый предварительно адрес другой строки. Например, если определили s, то эту переменную можно использовать таким образом:

char *s2=s; или char *s2; s2=s;

c) зарезервировать память для строки и определить значение s можно с помощью операции new:

unsigned n=10; char *s =new char[n], или char *s; s =new char[n],

где n — константа или переменная, значение которой должно быть, конечно, определено.

Рассматривая строку как обычный одномерный массив символов, можно запрограммировать некоторые простые алгоритмы. Однако более профессиональным и более эффективным способом, прежде всего для программиста, является использование встроенных функций. Необходимо обратить внимание на то, что количество такого рода средств (как правило, это методы и операции стандартных классов) для работы с текстовой информацией в современных системах увеличивается.

При вводе строк c помощью cin операция >> не всегда будет работать правильно. Если в строке есть пробелы, они игнорируются и строка вводится до первого пробела. Поэтому удобнее использовать специальную функцию для ввода строк gets. Например,

char Str[20]; gets(Str);

Функция считывает символы из стандартного текстового потока stdin, связанного с клавиатурой (подробности см. в главе “Файлы ”), и помещает их в массив символов. Символы считываются до тех пор, пока не встретится новая строка. Символ перехода на новую строку не добавляется в строку, а преобразовывается в нулевой символ, завершающий строку. Другими словами, символ ‘\0’ добавляется в строку автоматически после нажатия на клавишу “Ввод ”. В случае успеха возвращается строка, в противном случае функция возвращает указатель со значением NULL, то есть пустой (неопределённый) указатель. Напомним, что он играет роль false в операциях сравнения.

Для вывода строки на экран рекомендуется использовать функцию puts, например,

puts(Str);

Символ ‘\0’ в конце строки преобразуется в символ новой строки, то есть после выполнения этой функции (а не перед) осуществляется переход на новую строку экрана.

Вывести строку можно также с помощью функции printf, используя формат s:

printf(“%s”, Str);

Самостоятельно проведите компьютерный эксперимент для изучения такого метода вывода строки. Рассмотрите случай использования модификатора длины. Что получится, если вывести строку одним из операторов: 1) printf(“%30s”, Str); 2) printf(“%15s”, Str);?

Пусть строка объявлена как статический массив сивмолов и проинициализирована:

char t[30]="ABCDEF";

Строку можно вывести посимвольно:

for(int i=0; i<30; i++) putchar(t[i]); cout<<"End of string "<<endl;

В результате выведем строку ABCDEF и пробелы, что подтверждает вывод текста End of string не сразу после строки, а через пробелы. Это говорит о том, что память резервируется для указанного при объявлении количества символов, несмотря на то, что строка требует меньший объём памяти. Строку можно вывести посимвольно и так:

for (int i=0; t[i]; i++) putchar(t[i]); cout<<"End of string "<<endl;

Цикл выполняется, пока t[i] истинно, то есть пока t[i] не является символом конца строки. Это равносильно

for (int i=0; t[i]!=’\0’; i++) putchar(t[i]);

Вывод текста End of string сразу после ABCDEF без никаких пробелов означает, что в этом варианте выводим не все 30 символов строки t, а выводим символы до тех пор, пока не встретится символ ‘\0’, то есть пока не достигнем конца строки.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: