logo search
Шпора по информатике / 002

12.6 Указатели для массивов и строк

Указателю можно присваивать имя массива или функции, т.к. они трактуются

как адреса (см. раздел 8.4). Например, для массива mas из (12.2) можно создать указатель

int * uk = mas;

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

элемент массива mas c номером 1. Это можно написать так:

cout << mas[1] ; или cout << uk++;

При использовании цикла для длинных массивов второй способ эффективнее.

Написать mas ++ нельзя, т.к. имя массива - это константный указатель.

Для работы со строками и массивами в С++ принято создавать указатели,

т.к. операции с ними выполняются быстрее, чем с обычными переменными.

По этой же причине для передачи параметров в функции рекомендуется

использовать ссылки, но можно и указатели. Ссылки предпочтительнее

из-за того, что работа с ними проще, чем с указателями.

Работа с указателями очень сложна для начинающего программиста!

Указатели будут рассмотрены в лабораторных работах следующего семестра.

** cpp1 *** 17.5.2004

Лекция 13 Обработка строк

13.1 Основные правила для обработки строк в С++

Строки уже рассматривались ранее в разделе 10.1 и было показано, что для представления строк используются массивы. Обработку этих массивов можно выполнять как с помощью их индексов, так и указателей для них. В предыдущей лекции подчеркивалось, что для эффективной обработки строк обычно

используют указатели, а не индексы. Если быстродействие не учитывать, то

индексы предпочтительнее указателей из-за сложности понимания последних.

Кроме обычных массивов и строковых функций, соответствующих

процедурному программированию, в С++ для обработки строк можно применить объектно-ориентированное программирование (ООП), т.е. рассматривать строки как объекты и использовать специальные методы для работы с ними.

Понятие об ООП будет дано в следующей лекции.

Обобщим основные сведения о строках.

1. Строка – это массив символов: char s [4] ; char s [ ] = ” abc ” ;

  1. Обычно в конце строки обязателен символ конца строки ' \0' ,

который во многих случаях добавляется автоматически:

char s[4]={ ' a', ' b', ' c', ' \0 '}; char s[ ] = ” abc ” ;

  1. Индексы массива позволяют использовать каждый символ строки:

cout<<s[2];

  1. При выводе имени массива без индексов выводится весь массив:

cout<<s;

Отметим, что в отсутствие символа конца строки может появиться

много дополнительных символов справа и поэтому в этом случае

для вывода нужен цикл.

  1. Для работы со строками целесообразно использовать указатели: char *p = s;

Указатель – это переменная с адресом начала строки: p=&s .

  1. Для вывода (или ввода) строк можно использовать их имена или адреса,

т.е. указатели: cout << s; cout << p;

7. При выводе указателя на строку выводится строка, а не её адрес.

8. Указатели обеспечивают более быструю обработку строк, чем индексы:

s[2] или *(p + 2).

9. Указатель позволяет выделить память для строки динамически, т.е. при

выполнении exe-программы, а не при компиляции текста имя.cpp.

Для выделения памяти используется оператор new , cм. раздел 13.3.

  1. Функциям обработки строк соответствует заголовочный файл string.h .

Есть функции strlen, strcpy, strcat, strchr, strcmp, strncmp, strdup и т.д.

[И192, П435, Пд502]

11. Оператор cin>> вводит строку до первого пробела. При вводе строк

с пробелами можно использовать циклы, функцию gets или метод

cin.getline : gets (s); cin.getline ( s, 4);

Для функции gets нужен заголовочный файл stdio.h .

12. Для работы со строками в ООП удобно использовать класс string, которому

соответствует заголовочный файл cstring.h : # include < cstring.h >

13. Класс string имеет несколько конструкторов и несколько десятков методов,

например, length, getline, copy, append, compare, c_str и т.д. [П291, Пд532]

14. При инициализации строки класса string нужны скобки вместо знака

равенства, например, string s (“abcd”); т. к. здесь вызывается

конструктор.

15. Для класса string возможно использование некоторых операций вместо методов:

+ == != < += и т. д., например, string b = s + s; [П288].

Рассмотрим кратко функции и методы приведённой программы.

Функция strlen вычисляет длину строки s1 и в файле string.h имеет прототип

unsigned strlen ( char *s1);

Функция strcat приписывает вторую строку к первой и имеет прототип

char * strcat ( char *s1, char *s2);

Метод find возвращает позицию первого вхождения подстроки-аргумента

в исходную строку.

Метод append приписывает строку – аргумент к исходной строке.

Метод getline вводит строку или её часть, длиной не более указанного

количества символов с учетом концевого символа '\0' .

Для работы в системе Builder и для графики может быть полезна

функция sprintf, которая преобразует весь список выводимых значений в одну

строку с учетом всей информации о форме вывода. Имя строки-результата

является первым аргументом функции, а далее – всё как в функции printf:

управляющая строка и список вывода. Пример:

sprintf ( str, “ k= % i x=%5.2f \n “ , k, x ) ; (13.1)

Здесь str – это полученная строка символов, т.е. это либо символьный массив, либо указатель. Для функции sprintf нужно подключить заголовочный файл <stdio.h>