×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 80 из 714 Настройки
увеличивается, чтобы получить следующий символ строки >s. В теле цикла текущий символ переводится в верхний регистр.

В условии цикла >for используется новая часть — оператор логического AND (оператор>&&). Этот оператор возвращает значение >true, если оба операнда истинны, и значение >false в противном случае. Важно то, что этот оператор гарантирует обработку своего правого операнда, только если левый операнд истинен. В данном случае это гарантирует, что индексирования строки >s не будет, если переменная >index находится вне диапазона. Таким образом, часть >s[index] выполняется, только если переменная >index не равна >s.size(). Поскольку инкремент переменной >index никогда не превзойдет значения >s.size(), переменная >index всегда будет меньше >s.size().

Внимание! Индексирование не контролируется

При использовании индексирования следует самому позаботиться о том, чтобы индекс оставался в допустимом диапазоне. Индекс должен быть >>= 0 и >< size() строки. Для упрощения кода, использующего индексирование, в качестве индекса всегда следует использовать переменную типа >string::size_type. Поскольку это беззнаковый тип, индекс не может быть меньше нуля. При использовании значения типа >size_type в качестве индекса достаточно проверять только то, что значение индекса меньше значения, возвращаемого функцией >size().

Библиотека не обязана проверять и не проверяет значение индекса. Результат использования индекса вне диапазона непредсказуем.

Использование индексирования для произвольного доступа

В предыдущем примере преобразования регистра символов последовательности индекс перемещался на одну позицию за раз. Но можно также вычислить индекс и непосредственно обратиться к выбранному символу. Нет никакой необходимости получать доступ к символам последовательно.

Предположим, например, что имеется число от 0 до 15, которое необходимо представить в шестнадцатеричном виде. Для этого можно использовать строку, инициализированную шестнадцатью шестнадцатеричными цифрами.

>const string hexdigits = "0123456789ABCDEF"; // возможные

>                                             // шестнадцатеричные цифры

>cout << "Enter a series of numbers between 0 and 15"

>     << " separated by spaces. Hit ENTER when finished: "

>     << endl;

>string result;       // будет содержать результирующую

>                     // шестнадцатеричную строку

>string::size_type n; // содержит введенное число

>while (cin >> n)

> if (n < hexdigits.size()) // игнорировать недопустимый ввод

>  result += hexdigits[n];  // выбрать указанную

>                           // шестнадцатеричную цифру

>cout << "Your hex number is: " << result << endl;

Если ввести следующие числа:

>12 0 5 15 8 15

то результат будет таким:

>Your hex number is: C05F8F

Программа начинается с инициализации строки >hexdigits, содержащей шестнадцатеричные цифры от >0 до >F. Сделаем эту строку константной (см. раздел 2.4), поскольку содержащиеся в ней значения не должны изменяться. Для индексирования строки >hexdigits используем в цикле введенное значение >n. Значением >hexdigits[n] является символ, расположенный в позиции