Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 12

Строки

Строка – конечная последовательность символов. Количество символов в строке называется её длиной (текущей длиной). Допустимы строки нулевой длины.

· Основные операции над строками:

· поиск символов в строке;

· замена символов в строке;

· поиск, замена, удаление подстрок;

· вставка в строку новой подстроки;

· сцепление (конкатенация) двух строк.

В результате выполнения этих операций длина строки может измениться!

Средства C++ для работы со строками

Для работы со строками символов язык C++ предоставляет две возможности:

· работу с массивами данных типа char (функции для работы с такими данными описаны в файлах <string.h> или <cstring>

· класс string, описанный в файле <string>

Работа со строками фиксированной длины

Если длина строки известна, не равна нулю и не изменяется, для её хранения можно использовать массив соответствующего размера.

Пример: номер зачётной книжки всегда состоит из 7 символов

char nz[7];

nz[0] = '1'; nz[1] = '0'; nz[2] = '2'; nz[3] = '3';

nz[4] = '1'; nz[5] = '6'; nz[6] = '9';

for (int i=0; i<7; i++)

cout << nz[i];

Неудобства такого подхода – строку можно обрабатывать только посимвольно!

Нуль-терминированные строки

Нуль-терминированные строки – строки, в которых символ с кодом 0 является признаком конца строки и не входит в её состав.

Нуль-терминированные строки используются:

· в строковых константах;

· при вводе-выводе;

· в стандартных функциях, описанных в файле <string.h>

Примеры строковых констант:
"T"
"This is \”string \”.”
"This is character string"
"Это строковая константа"
"A" "1234567890" "0" "$"

\" внутри строки означают, что в строку входит символ ".
Символы строки записываются в последовательные ячейки памяти. В конце каждой строки компилятор помещает нулевой символ '\0'. Строковые константы размещаются в статической памяти. Вся фраза в кавычках является указателем на место в памяти, где записана строка (аналогично имени массива).

Определение и инициализация строк

Строка объявляется как массив символов:
char *str;
или
char str[10];
При инициализации строки размерность массива лучше не указывать.
char *str="This is a string";
char str[]="This is a string“;

Такой вид инициализации является краткой формой стандартной инициализации массива
char str[]={’T’,’h’, ’i’, ’s’, ’ ’, ’i’, ’s’, ’ ’, ’a’,’ ’, ’s’, ’t’, ’r’, ’i’, ’n’,’g’,’\0’};
Без символа 0 имеем обычный массив символов, а не строку.
Как и для других массивов, имя str является указателем на первый элемент массива:
str == &str[0], *str == 'T', *(str+1) == str[1] == 'h'

Массив и указатель: различия

char h1[ ] =
"Программирование на языке Cи++";
char *h2 =
"Программирование на языке Pascal";
Основное отличие состоит в том, что указатель h1 является константой, в то время как указатель h2 - переменной.
В первом случае создается массив из 31 символа в статической памяти (по одному на каждый символ строки +1 на ’\0’).

h1 -синоним адреса первого элемента массива, т.е. &h1[0].

Нельзя изменить h1, так как это означало бы изменение адреса массива в памяти.

Можно использовать h1+1 (выбор следующего символа строки), но нельзя использовать выражение ++ h1.

В случае с указателем также создается в статической памяти массив для строки (из 33 символов). Но кроме этого выделяется еще место для переменной - указателя h2. Сначала эта переменная указывает на начало строки, но ее значение может изменяться: ++h2 будет указывать на второй символ строки.

Использование операции сложения с указателем для выбора следующих символов строки допустимо для обоих вариантов:

for(int i=0;i<16;i++)
printf("%c",*(h1+i));
printf("\n");

for(i=0;i<16;i++)
printf("%c",*(h2+i));
printf("\n");

В результате получаем
Программирование
Программирование

Операцию увеличения можно использовать только для указателя:
while ((*h2)!= '\0')
printf("%c",*(h2++));
//
Программирование на языке Cи++
Если нужно заменить h2 на h1, можно так: h2=h1;
Но h1 = h2; - запрещенная конструкция.
Ситуация аналогична x = 5 или 5 = x.
Левая часть оператора присваивания должна быть именем переменной.

Инструкция h2 = h1 не уничтожит строку про язык Cи, а только изменит адрес, записанный в h2.
Инструкции
h1[13] ='C'; и *(h1+8)='C';
позволяют изменять элементы первой строки.

Ввод-вывод строк
1. Использование операторов >> и <<
const int MAX=80;
char name[MAX];

cout<<” Привет, как вас зовут?”<<endl;
cin>>name;
cout<<”Хорошее имя ”>>name>>endl;

Оператор >> вводит символы до тех пор, пока не будет нажата клавиша ввода, затем в строку дописывается символ ‘\0’. Таким образом в name можно ввести до 79 символов.
Оператор << выводит символы до конечного ‘\0’.
Что произойдет, если ввести более 79 символов?

Так как в С++ нет проверки выхода индекса за границы массива, можно получить непредсказуемые результаты.
Однако существует способ защиты от ввода лишних символов:

cin>>setw(MAX)>>name;

Метод setw определяет максимальное количество символов, которое можно ввести, включая ‘\0’. Таким образом в name можно ввести до 79 символов.
2. Использование метода get
Если в предыдущем примере введем строку, содержащую пробелы внутри, то введется только первое слово, ибо оператор << считает пробел нулевым символом.
// ввод строки с пробелами
cin.get(name,MAX);
Если в нужно ввести в строку несколько строк с клавиатуры, то нужно задать 3-ий аргумент – признак конца последней строки
// ввод нескольких строк
// $-признак конца ввода
cin.get(name,MAX,$);
3. Использование функций gets и puts

char *gets (char *s);//ввод строки
Функция читает символы до тех пор, пока не встретится символ новой строки ‘\n’, который создается при нажатии клавиши ввода. Функция берет все символы до ‘\n’ (не включая его) и присоединяет к ним символ ‘\0’.
int puts(const char *s);//вывод строки


gets(name);
puts(name);
При неудачном завершении работы функция gets возвращает значение NULL.

Поэтому можно проверять правильность ввода и определять конец ввода (EOF):

while (gets(name)!=NULL)…

При неудачном завершении работы функция puts возвращает значение EOF, иначе – ненулевое число.

puts -записать строку в стандартный файл вывода stdout.

<== предыдущая лекция | следующая лекция ==>
Великое княжество Литовское и Русское в ХIII – нач. ХV в | Функция возвращает индекс первого символа из s1, отсутствующего в s2
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 288; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.