Similar presentations:
Строки. Статические строки
1.
Лекция «Строки»Читает старший преподаватель
Филимонова Ольга Александровна
2.
Строка – это последовательностьсимволов, завершающаяся ‘\0’ ≡ 0
символом.
Объем выделенной памяти под строку, как правило не
совпадает с реальным размером введенной строки.
Нуль-символ указывает, где на самом деле
завершается строка.
Благодаря наличию множества
стандартных функций, со строкой часто
работают как с единым целым (при
вводе, выводе и т.д.).
Если мы хотим работать со строкой, как
с единым целым, необходимо указать
имя или адрес строки.
3.
Статические строкиКак объявить строку?
const int N=80; // объем выделенной памяти
// объявление строки без инициализации
char str[N];
// объявление строки с инициализацией
char str[N]= “Hello!!!”;
4.
Как определить адрес строки?Имя строки является константным адресом строки.
Адрес строки - адрес первого символа(байта) строки.
i
str
0
1
2
3
4
5 ......
H
E
L
L
O
!
str
\0
5.
Как определить адрес произвольногосимвола строки?
str + i
- Адрес символа строки с индексом i , где
i=0, 1, 2, …
6.
Как определить значение произвольногосимвола?
*(str + i)
str[i]
значение символа с индексом i, где
i=0, 1, 2, …
7.
Динамические строкиКак объявить строку?
//размер строки задаем константным
значением
const int N=80;
//или переменной
int N;
cin>>N;
//объявление динамической строки
char*p=new char [N];
//не забываем освобождать память
delete [ ]p;
8.
Как определить адрес строки?По определению операции new выделяется N байт
памяти и в качестве результата возвращается
адрес 1-го байта выделенной памяти
p- адрес строки
9.
Как определить адреспроизвольного символа строки?
i 0 1 2
a b
c
3 ....
d
f
q \0
p
p+i
- адрес i-го символа строки, где i = 0, 1, 2, …
10.
Как определить значениепроизвольного символа строки?
*(p + i)
p[i]
значение i-го символа строки, где i=0, 1,...
11.
Стандартный цикл обработкистроки на основе индекса
текущего символа
Стандартный цикл применяется к любым строкам,
не важно как выделена память.
char str[80];
int i; // переменная цикла – индекс элемента строки
i 0 1 2
a
b
3 ....
c q \0
for(i=0; str[i]!=0; i++)
{
//как обработать i-ый символ строки
str[i]
*(str+i)
}
12.
Стандартный цикл переборастроки на основе адреса текущего
символа
char *pBegin = new char[80];
char *p; //переменная цикла- адрес текущего символа
for(p=pBegin; *p!=0; p++)
{
//как обработать текущей символ строки с адресом р: *р
}
…….
delete [ ] pBegin;
13.
Задача №1Дана строка. Подсчитать реальный размер
строки. Способ 1 с использованием индекса
14.
Способ 2 с использованием указателя15.
Задача №2Даны две строки. Дописать вторую строку в
конец первой.
Необходимо выполнить следующие действия:
1) определить позицию ноль символа в первой
строке (найти ее конец)
2) для каждого символа второй строки выполняем
(перебор 2-ой строки) :
Очередной символ записываем в текущую позицию первой строки
Увеличиваем позиции в первой и во второй строке
3) замыкаем первую строку нуль-символом.
Задачу удобнее решать через указатели.
16.
#include <iostream>using namespace std;
int main (void)
{
сonst int N=80;
char *pBegin1, *pBegin2, *p1, *p2;
pBegin1=new char[N+1];
pBegin2=new char[N/2];
cout<<“\n Stroki: “;
cin.getline(pBegin1, N/2);
cin.getline(pBegin2, N/2);
for (p1=pBegin1; *p1!=0; p1++) //ищем конец первой строки
;
//пустое тело цикла
for (p2=pBegin2; *p2!=0; p1++, p2++) //перебор второй строки
*p1=*p2; //запись символа второй строки в первую
*p1=0;
//замыкаем первую строку нуль-символом
cout<<pBegin1<<endl;
delete [ ] pBegin1;
//освобождаем память
delete [ ] pBegin2;
return 0;
}
programming