Читаем Освой самостоятельно С++ за 21 день. полностью

После объявлении константного объекта указатель this также будет использоваться как константный. Следует отметить, что использование указателя const this допускается только в методах, объявленных со спецификатором const.

Более подробно этот вопрос рассматривается на следующем занятии при изучении ссылок на константные объекты.

Вычисления с указателями

Один указатель можно вычитать из другого. Если, например, два указателя ссылаются на разные элементы массива, вычитание одного указателя из другого позволяет получить количество элементов массива, находящихся между двумя заданными. Наиболее эффективно эта методика используется при обработке символьных массивов (листинг 8.11).

Листинг 8.11. Выделение слов из массива символов

1: #include

2: #include

3: #include

4: bool GetWord(char* string, char* word, int& wordOffset);

5: // основная программа

6: int main

7: {

8:    const int bufferSize = 255;

9:    char buffer[bufferSize+1]; // переменная для хранения всей строки

10:   char word[bufferSize+1]; // переменная для хранения слова

11:   int wordOffset = 0; // начинаем с первого символа

12:

13:   cout << "Enter а string: ";

14:   cin.getline(buffer,bufferSize);

15:

16:   while (GetWord(buffer,word,wordOffset))

17:   {

18:      cout << "Got this word: " << word << endl;

19:   }

20:

21:   return 0;

22:

23: }

24:

25:

26: // Функция для выделения слова из строки символов.

27: bool GetWord(char* string, char* word, int& wordOffset)

28: {

29:

30:    if (!string[wordOffset]) // определяет конец строки?

31:      return false;

32:

33:    char *p1, *p2;

34:    p1 = p2 = string+wordOffset; // указатель на следующее слово

35:

36:    // удаляем ведущие пробелы

37:    for (int i = 0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)

38:      p1++;

39:

40:    // проверка наличия слова

41:    if (!iKalruj[n(pl[0]))

42:      return false;

43:

44:    // указатель р1 показание начало сдолующего слова

45:    // iа к жо как и p2

46:    p2 = p1;

47:

48:    // перпмещавм p2 и конец олова

49:    while (isalnum(p2[0]))

50:      p2++;

51:

62:    // p2 указывает на конец слова

53:    // а p1 - в начало

54:    // разность указатолой показываот длину слова

55:    int len = int (p2 - p1);

56:

57:    // копируем слово в буфер

58:    strncpy (word,p1,len);

59:

60:    // и добавляем символ разрыва сроки

61:    word[len]='\0';

62:

63:    // ищем начало следующего слова

64:    for (int i = int(p2-string); K(int)strlen(string) && !isalnum(p2[0]); i++)

65:      p2++;

66:

67:    wordOffset = int(p2-string);

68:

69:    return true;

70: }


Результат:

Enter а string: this code first appeared jn C++ Report

Got this word: this

Got this word: code

Got this word: first

Got this word: appeared

Got this word: in

Got this word: C

Got this word: Report


Анализ: В строке 13 пользователю предлагается ввести строку. Строка считывается функцией GetWord, параметрами которой является буферизированная переменная для хранения первого слова и целочисленная переменная WordOffset. В строке 11 переменной WordOffset присваивается значение 0. По мере ввода строки (до тех пор пока GetWord не возвратит значение 0) введенные слова отображаются на экране.

При каждом вызове функции GetWord управление передается в строку 27. Далее, в строке 30, значение string[wordOffset ] проверяется на равенство нулю. Выполнение условия означает, что мы находимся за пределами строки. Функция GetWord возвращает значение false.

В строке 33 объявляются два указателя на переменную символьного типа. В строке 34 оба указателя устанавливаются на начало следующего слова, заданное значением переменной WordOffset. Исходно значение WordOffset равно 0, что соответствует началу строки.

С помощью цикла в строках 37 и 38 указатель р1 перемещается на первый символ, являющийся буквой или цифрой. Если такой символ не найден, функция возвращает false (строки 41 и 42).

Таким образом, указатель p1 соответствует началу очередного слова. Строка 46 присваивает указателю p2 то же значение.

В строках 49 и 50 осуществляется поиск в строке первого символа, не являющегося ни цифрой, ни буквой. Указатель p2 перемещается на этот символ. Теперь p1 и p2 указывают на начало и конец слова соответственно. Вычтем из значения указателя p2 значение р1 и преобразуем результат к целочисленному типу. Результатом выполнения такой операции будет длина очередного слова (строка 55). Затем на основании данных о начале и длине полученное слово копируется в буферную переменную.

Строкой 61 в конец слова добавляется концевой нулевой символ, служащий сигналом разрыва строки. Далее указатель p2 перемещается на начало следующего слова, а переменной WordOffset присваивается значение смещения начала очередного слова относительно начала строки. Возвращая значение true, мы сигнализируем о том, что слово найдено.

Чтобы как можно лучше разобраться в работе программы, запустите ее в режиме отладки и последовательно, шаг за шагом, проконтролируйте выполнение каждой строки.

Резюме

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT