При использовании индексирования следует самому позаботиться о том, чтобы индекс оставался в допустимом диапазоне. Индекс должен быть >= 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]
является символ, расположенный в позиции n
строки hexdigits
. Например, если n
равно 15
, то результат — F
; если 12
, то результат — С
и т.д. Полученная цифра добавляется к переменной result
, которая и выводится, когда весь ввод прочитан.
Всякий раз, когда используется индексирование, следует позаботиться о том, чтобы индекс оставался в диапазоне. В этой программе индекс, n
, имеет тип string::size_type
, который, как известно, является беззнаковым. В результате значение переменной n
гарантированно будет больше или равно 0
. Прежде чем использовать переменную n
для индексирования строки hexdigits
, удостоверимся, что ее значение меньше, чем hexdigits.size()
.
Упражнение 3.6. Используйте серийный оператор for
для замены всех символов строки на X
.
Упражнение 3.7. Что будет, если определить управляющую переменную цикла в предыдущем упражнении как имеющую тип char
? Предскажите результат, а затем измените программу так, чтобы использовался тип char
, и убедитесь в своей правоте.
Упражнение 3.8. Перепишите программу первого упражнения, сначала используя оператор while
, а затем традиционный цикл for
. Какой из этих трех подходов вы предпочтете и почему?
Упражнение 3.9. Что делает следующая программа? Действительно ли она корректна? Если нет, то почему?
string s;
cout << s[0] << endl;
Упражнение 3.10. Напишите программу, которая читает строку символов, включающую знаки пунктуации, и выведите ее, но уже без знаков пунктуации.