Строки. стандартные функции для обработки строк.

Цель работы: ознакомиться с особенностями использования символьных переменных; с функциями, позволяющими вести обработку символьных строк. Научиться работать с массивом символьных строк и применять указатели при работе со строками.

1. Теоретические сведения

В С++ символьная строка представляет собой массив символов, за которыми следует символ NULL (‘\0’), т.е. в C++ символьные строки хранятся в массиве типа char, который заканчивается символом NULL (или ASCII 0). При объявлении символьной строки объявляется массив типа char. Когда программа позднее присваивает символы строке, она отвечает за добавление символа NULL, который представляет конец строки. Если используется строковые константы, заключенные в двойные кавычки, компилятор C++ автоматически добавляет символ NULL. В C++ большинство специальных функций обработки символьных строк используют символ NULL для определения последнего символа строки. Формат объявление символьной строки:

char имяСтр [длинаСтроки];

где, имяСтр – любой правильный идентификатор, а длинаСтроки –количество символов в строке.

Например:

char stroka1[15];

char filename[64];

Например, следующее объявление

char filename[64];

создает переменную символьной строки с именем filename, способную хранить 64 символа , при этом символ NULL является последним из этих 64 символов, т.е. это объявление создает массив с элементами, индексируемыми от filename[0] до filename[63].

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

Когда выходной поток cout выводит символьную строку, он по одному выводит символы строки, пока не встретит символ NULL. Короче говоря, cимвол NULL указывает программе последний символ в строке.При создании символьной строковой константы компилятор C++ автоматически добавляет символ NULL, как показано на рис. 1

Строки. стандартные функции для обработки строк.

Рис. 1. Компилятор C++ автоматически добавляет символ NULL к строковым константам.

При рассмотрении программ на C++ часто встречаются символы, заключенные в одинарные кавычки (например, ‘А’) и символы, заключенные в двойные кавычки (А). Они отличаются. Символ внутри одинарных кавычек представляет собой символьную константу. Компилятор C++ выделяет только один байт памяти для хранения символьной константы. Однако символ в двойных кавычках представляет собой строковую константу — указанный символ и символ NULL (добавляемый компилятором). Таким образом, компилятор будет выделять два байта для символьной строки.

Ввод строки. Ввод строки в программе можно осуществить несколькими способами:

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

char title[64] = Учимся программировать на языке C++;

Если количество символов, присваиваемое строке, меньше размера массива, большинство компиляторов C++ будут присваивать символы NULL остающимся элементам строкового массива. Как и в случае с массивами других типов, если вы не указываете размер массива, который инициализируете при объявлении, компилятор C++ распределит достаточно памяти для размещения указанных букв и символа NULL, например:

char title[] = Учимся программировать на языке C++;

Еще один способ инициализации это- с помощью указателей. При этом, как и выше описанных случаях, не нужно заранее выделять память для строки. Компилятор по внешнему виду строки определит необходимое количество байтов, в том числе один байт на символ конца строки. Например:

char *str;

str = ” строка”;

Это же самое можно записать так:

char *str = “строка”;

Для ввода строки часто используется функция gets ( ), считывающая строки. Она получает строку от стандартного устройства ввода, которым является клавиатура. Поскольку строка не имеет заранее заданной длины, функция gets ( ) должна знать, когда ей прекратить работу. Функция читает символы до тех пор, пока ей не встретится символ новой строки (‘\n’), который создается при нажатии клавиши Enter. Функция берет все символы до ( но не включая ) символа новой строки, присоединяет к ним нуль–символ (‘\0’) и передает строку вызывающей программе. Если все идет хорошо, функция gets ( ) возвращает считанную строку. Если что-то неправильно или встретился символ EOF, то она возвращает символ NULL или нулевой адрес.

Пример 4. Рассмотрим пример считывания и вывода строки.

#include

#include /* Подключение файла string.h для работы со строками*/

main ( )

{ char name [ 20 ]; /*Выделение памяти*/

gets ( name ); /*Размещение введенной информации в строку name*/

printf ( “%s”, name); /*Вывод строки*/

}.

В приведенном примере для вывода строки использована функция printf ( ). Для вывода строк чаще всего используют функцию puts ( ). Разница между функциями состоит в том, что

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

printf (“%s\n”, string);

дает то же самое, что и

puts ( string ) ;

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

Пример 5.

#include

#include

main ( )

{ static char str1[ ] = “массив инициализирован”;

char *str2 = “Указатель инициализирован”;

puts ( str1 );

puts ( str2 );

puts ( str1[4] );

puts ( str2+4);

}.

В результате работы получаем:

массив инициализирован

указатель инициализирован

ив инициализирован

атель инициализирован

Обратите внимание на два последних оператора. Указатель str1[4] ссылается на пятый элемент массива str1. Этот элемент содержит символ ‘и’, и функция puts ( ) использует его в качестве начальной точки. Аналогично str2+4 ссылается на ячейку памяти, содержащую ‘а’, и с которой начинается вывод строки.

Функции работы со строками и символами.В С++ есть две возможности работы со строками: 1) использование функции унаследованные из библиотеки языка С;

2) использование библиотечного класса string.

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

Тип данных или библиотечный класс string лишен от этих недостатков но может проигрыв массивам символов в эффективности.

Описания функции работы со строками и символами находится в основном заголовочном файле string.h , а так же в заголовочных файлах stdlib.h, ctype.h.

Функции над строками

В языке Си существует много функций работы над строками. Рассмотрим некоторые из них.

1) Функция strlen ( str ) вычисляет длину строки. Тип результата unsigned (беззнаковый) .

2) Функция конкатенации /или объединения/ strcat ( str1, str2 ) приписывает строку str2 к строке str1, и это объединение становится новой первой строкой.

Функция конкатенацииstrncat ( str1, str2, kol ) приписывает kol символов строки str2 к строке str1 и результат присваивается к str1 .

Задание №1

Задание взять из таблицы согласно варианту и написать программу.

В Задание
Заданы 2 строки, состоящие из слов, разделенных пробелами. Объединить обе строки и поменять местами второе и третье слова.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Скопировать пять символов второй строки в первую. Получить из измененной первой строки новую, в которой не будет последнего и предпоследнего слов.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать первое слово второй строки к первой. Получить из измененной первой строки новую, в которой не будет первого слова.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить первое вхождение символа “м” в строке и вывести строку, начиная с этой позиции и до конца. Если такого символа в строке нет, то удалить второе слово и вывести получившуюся строку.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке. Если такого символа нет, то вывести всю строку, исключив из нее последнее слово.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Если последнее слово больше предпоследнего, то заменить первые пять символов буквой “а”, в противном случае все символы заменить на “*”.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Если второе слово первой строки такое же, как второе слово второй строки, то поменять порядок следования символов первой строки на противоположный, в противном случае заменить все символы второй строки на “!”
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым совпал с одним из символов второй. Вывести первую строку, исключив из нее слово, в которое входит этот символ. Вторая строка пробелами не разделена.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с одним из символов второй строки. Вывести слово, в которое входит этот символ.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой. Поменять местами в измененной первой строке первое и последнее слово.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить первое вхождение символа “d” в строке и вывести слово, в котором оказался этот символ. Если такого символа нет, то изменить порядок следования символов на противоположный.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым совпал с одним из символов второй строки. Приписать ко второй строке часть первой, начиная с этого символа. Если этого совпадения не произойдет, то все символы второй строки заменить нулями.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с одним из символов второй строки. Выделить слово, в которое входит эото символ, и приписать его ко второй строке.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать второе слово второй строки к первой. Поменять порядок следования символов первой строки на противоположный.
Заданы 2 строки, состоящие из слов, разделенных пробелами. Если первое слово первой строки равно последнему слову второй, то приписать к первой строке первое слово второй, в противном случае вывести вторую строку, исключив из нее последнее слово.

Задание №2

Задание взять согласно варианту и написать программу.

1.Напечатать true,если в заданном тексте буква “а” встречается чаще , чем буква “в”,и напечатать false в противном случае.

2.Напечатать заданый непустой текст,удалиев из него все цифры и удвоив знаки “+” и “-”.

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

4.Известно, что в заданный текст входит буквы “а”, причем не на последнем месте.Требуется напечатать литеру текста, непосредственно следующую за первым вхождением “а”.

5.Напечатать заданный непустой текст,удалив из него все знаки “+”,непосредственно за которыми идет цифра .

6.Напечатать заданный непустой текст , заменив в нем все пары ph на букву f.

7.Дана непустая последовательность непустых слов из латынских букв; соседние слова отделены друг от друга запятой; за последним словом-точка.Определить количество слов, которые начинаются с буквы “а”.

8.Если в заданый текст входит каждая из букв слова key,тогда напечатать yes,иначе-no.

9.Значениями литерных переменных с 2, с 1 и с 0 является цифры. Прсвоить целой переменной k число, составленное из этих цифр (например, если с 2= `8`,c 1=`0` u c 0=`5`,то k = 805).

10.Напечатать заданный непустой текст,удалив из него все буквы “в”,непостредственно перед которыми находится буквы `c`.

11.Проверить,правильно ли в заданном тексте расставлены круглые скобки (т.е.находится ли справа от каждой открывающей скобки,а слева от каждой закрываюшей соответствующей ей открывающей). Ответ – ДА или НЕТ.

12.Дана непустая последовательность непустых слов из латинских букв. Определить количество слов, оканчивающихся буквой “w”.

13.Выяснить, имеется ли пара соседствующих символов,- (запятая, тире) в тексте.

14.Дан текст. Определить количество слов начинающихся и оканчивающихся одной и той же буквой.

15.Вывести последовательность abbccc…zzz…z.

16.Дан текст. Определить количество слов, которые содержат три буквы е.

Строки в с++. Нуль терминатор. Что такое строка в с++. char c++ массив. С++ Для начинающих. Урок #60


Похожие статьи.

Понравилась статья? Поделиться с друзьями: