574________ ________________Часть IV. Новые возможности C++

строке targetString, начиная от символа 4. Функция поиска возвращает значение 4.

Во втором примере снова производится поиск строки "цель", но уже начиная с 9 символа, соответствующего символу "н" в слове "наших". Какой вы ожидаете результат? Ноль? Нет, это означало бы, что строка "цель" найдена в нулевой позиции. Очевидно, что после девятого символа в строке targetString нет слова "цель". Действительное возвращаемое значение оказывается равным 4 294 967 295. Как это может быть? Если вы не новичок в программировании и имеете опыт работы с шестнадцатеричной арифметикой, то вы, возможно, узнали в этом числе десятичное представление шест-надцатеричного значения OXFFFFFFFF. В зависимости от того, рассматриваете ли вы это число как положительное или отрицательное, вы получите совершенно разное десятичное значение.

Замечание

OXFFFFFFFF как беззнаковое число равно 4 294 967 295, а как число со знаком — это -1. Вспомните описание конструкторов строкового класса из Справочника по библиотеке классов. В качестве аргументов некоторых из них было указано size_t n = NPOS. Значение NPOS используется библиотекой как сигнальное; например, если вы хотите удалить из строки несколько Символов, начиная от символа в позиции 3, и не указываете число удаляемых символов, то используется значение NPOS. NPOS представляет собой самое большое беззнаковое число, которое будет подставлено в качестве аргумента size_t, оно и позволит функции удалить символы от позиции 3 до конца строки. Если попытаться вывести значение NPOS при помощи потоковой операции вывода «, то в результате получится значение 4294 967295, которое, однако, было определено как size_t(-l). Что это дает? size_t представляет собой целое число без знака. Если вы хотите убедиться в неудаче поиска, обязательно сравнивайте полученное значение со значением NPOS, а не с -1. Конечно, можно использовать для сравнения -1, если везде приводить его к типу size_t, но в конце концов где-нибудь вы забудете это сделать. Так что лучше не пробовать — сравнивайте С NPOS.

Совет

Старайтесь всегда сравнивать возвращаемые значения с символическими, такими как NPOS, если они есть. В противном случае разница между знаковыми и беззнаковыми значениями может быть ва"ми не замечена даже при отладке. Будьте осторожны!

Третий и четвертый примеры иллюстрируют разницу между функциями find и rfind. С помощью find производится поиск слова "поиск" от начала строки targetString. Это слово находится в позиции 15. Наоборот, с помощью

rfind ПРОИЗВОДИТСЯ ПОИСК СЛОВа "поиск" ОТ КОНЦа СТрОКИ targetString. В

этом случае оно находится в позиции 41.