Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 10 Символы и строки.doc
Скачиваний:
52
Добавлен:
29.02.2016
Размер:
166.4 Кб
Скачать

Строки и указатели

Указатели могут адресовать переменные, массивы всех типов, таких как int, float, double и другие, включая тип char. Строка доступна через указатель на первый символ в строке. Строковые указатели объявляются как char*:

char * pstr = "ABCDE";

Объявляется переменная-указатель pstr, которая будет содержать адрес начала строки "ABCDE". Этот оператор можно записать и так:

char * pstr; pstr = "ABCDE";

Следует различать следующие операторы:

сhar * pstr = "ABCDE"; и char mas[] = "ABCDE";

В первом случае значение указателя может быть изменено, так как указательэто переменная. Во втором случае значение имени массива не может быть изменено, так как имя массива – это константа.

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

Если в программе объявлен указатель

сhar * pstr;

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

  • можно использовать ранее определённую статическую cтроку:

char s[] = "ABCD"; pstr = s;

  • можно использовать определённый ранее адрес другой строки:

char * s = "ABCD"; pstr = s;

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

int n = 10; pstr = new char[n];

// Пример 10.4. Указатели на тип char.

#include <iostream>

#include <cstring>

using namespace std;

int main(){

char *s1,*s2,*st = "0123456789";

cout<<"st = "<<st<<endl; // st = 0123456789

s1 = st + 5;

cout<<"s1 = "<<s1<<endl; // s1 = 56789

cout<<"*s1 = "<<*s1<<endl; // *s1= 5

cout<<"&st[5] = "<<&st[5]<<endl; // &st[5] 56789

cout<<"st[5] = "<<st[5]<<endl; // st[5]== 5

//---------------------------------------------------------------------------------------

s1--;

cout<<"s1 = "<<s1<<'\n'; // s1== 456789

cout<<"*(s1+2) = "<<*(s1+2)<<'\n'; // *(s1+2)== 6

//---------------------------------------------------------------------------------------

cout<<"&st== "<<&st<<endl; // адрес самого указателя

cout<<"(int)st== "<<(int)st<<endl; // адрес строки

cout<<"&st[1]== "<<(int)(st+1)<<endl; // адрес 1-го символа

cout<<"&st[9]== "<<(int)(st+9)<<endl; // адрес 9-го символа

//---------------------------------------------------------------------------------------

char s3[20];

cout<<"Vvedi s3: "<<endl; gets(s3); // 123456789

cout<<"s3 = "<<s3<<endl;

s3[5] = '\0'; cout<<"s3 = "<<s3<<endl; // s3 = 12345

system("pause");

}

// Пример 10.5. . Создание и удаление динамической строки.

#include <iostream>

#include <cstring>

using namespace std;

int main(){

int n;

cout<<"Vvedi n: "; cin>>n;

char * s = new char[n];

if (!s){ cout <<"No memory"; exit(1); }

fflush(stdin); cout<<"vvedi stroku s: "; gets(t);

puts(s); // вывод строки

delete [] s;

}

Строки и функции

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

// Пример 10.6 Используются функции вывода строки,

// преобразования символов строки к верхнему регистру.

#include <iostream>

using namespace std;

void strShow(char * str){ // функция вывода строки

cout<<"str = ";

while(*str) cout<<*str++;

cout<<endl;

}

void strUpper(char * str){ // перевод в верхний регистр

int i = 0;

while(str[i]){

if(str[i] >= 'a' && str[i] <= 'z') str[i] = str[i] - 32;

i++;

}

}

int main(){

int n;

cout<<"Vvedi max chislo simvolov v stroke:"; cin>>n;

char * pstr = new char [n+1]; // выделение памяти под строку

if(!pstr){cout<<"No memory"; exit(1);}

fflush(stdin); // после ввода числа очищаем поток ввода

cout<<"vvedi stroku < "<<n<<" simvolov:"; gets(pstr);

strShow(pstr);

strUpper(pstr);

cout<<"\nrezult: "<<pstr<<endl;

delete [] pstr; // освобождение памяти

system("pause");

}

// Пример 10.7. Определить, есть ли в строке заданный символ.

// Оформить в виде функции.

#include <iostream>

#include <cstring>

using namespace std;

int poisk(char * str, char c);

int main(){

char *st, c;

int p, n;

cout<<" Vvedi n: "; cin>>n;

st = new char[n];

if (!st){ cout <<"No memory"; exit(1); }

cout<<"Vvedi stroku :"; fflush(stdin); gets(st);

cout<<"Vvedi simvol:"; cin>>c;

p = poisk(st, c);

if(p) cout<<"Yes"<<endl; else cout<<"No simvola"<<endl;

delete [] st;

system("pause");

}

int poisk(char * str, char c){ // функция поиска символа

int pr=0;

while (*str)

if((*str++) == c){pr = 1; break;}

return pr;

}