>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]
является символ, расположенный в позиции