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 ” ;
Обычно в конце строки обязателен символ конца строки ' \0' ,
который во многих случаях добавляется автоматически:
char s[4]={ ' a', ' b', ' c', ' \0 '}; char s[ ] = ” abc ” ;
Индексы массива позволяют использовать каждый символ строки:
cout<<s[2];
При выводе имени массива без индексов выводится весь массив:
cout<<s;
Отметим, что в отсутствие символа конца строки может появиться
много дополнительных символов справа и поэтому в этом случае
для вывода нужен цикл.
Для работы со строками целесообразно использовать указатели: char *p = s;
Указатель – это переменная с адресом начала строки: p=&s .
Для вывода (или ввода) строк можно использовать их имена или адреса,
т.е. указатели: cout << s; cout << p;
7. При выводе указателя на строку выводится строка, а не её адрес.
8. Указатели обеспечивают более быструю обработку строк, чем индексы:
s[2] или *(p + 2).
9. Указатель позволяет выделить память для строки динамически, т.е. при
выполнении exe-программы, а не при компиляции текста имя.cpp.
Для выделения памяти используется оператор new , cм. раздел 13.3.
Функциям обработки строк соответствует заголовочный файл 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>
- 10.3 Операторы управления
- 10. 4 Оператор мультиветвления switch
- 10.6 Применение функции printf для форматирования
- 11.1 Графические программы
- 11.2 Построение символьного графика
- 11.4 Построение графика в графическом режиме
- 12.1 Передача данных для построения графика в MathCad
- 12.4 Указатели
- 12.5 Описание указателей
- 12.6 Указатели для массивов и строк
- 13.3 Оператор динамического выделения памяти new
- Void main ( ) {
- Void tab( ); };
- Void main ( ) {
- 15.1 Класс объектов, элементы класса
- 15.2 Доступ к элементам класса
- 15.3 Вызов элементов класса
- 15.4 Конструкторы классa
- 15.5 Пример класса Tkplk
- 16.1 Наследование
- 16.2 Полиморфизм
- 16.3 О перегрузке функций и операций
- 17. 1 Среда программирования и библиотека vcl
- 17.2 Консольное приложение в Builder
- При выполнении лабораторных работ в дисплейном классе используется
- 17.5 Вид экрана в builder
- 17.6 Работа с проектом в системе Builder
- 18.1 Редактор кода
- 18.4 Пример запроса, ввода, вывода для Win -программы