×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 79 из 714 Настройки
. По завершении этого цикла все символы в строке >str будут в верхнем регистре.

Обработка лишь некоторых символов

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

Существуют два способа доступа к отдельным символам в строке: можно использовать индексирование или итератор. Более подробная информация об итераторах приведена в разделе 3.4 и в главе 9.

Оператор индексирования (оператор>[]) получает значение типа >string::size_type (раздел 3.2.2), обозначающее позицию символа, к которому необходим доступ. Оператор возвращает ссылку на символ в указанной позиции.

Индексация строк начинается с нуля; если строка >s содержит по крайней мере два символа, то первым будет символ >s[0], вторым — >s[1], а последним символом является >s[s.size() - 1].

Значения, используемые для индексирования строк, не должны быть отрицательными и не должны превосходить размер строки (>>= 0 и >< size()). Результат использования индекса вне этого диапазона непредсказуем. Непредсказуема также индексация пустой строки.

Значение оператора индексирования называется индексом (index). Индекс может быть любым выражением, возвращающим целочисленное значение. Если у индекса будет знаковый тип, то его значение преобразуется в беззнаковый тип >size_type (см. раздел 2.1.2).

Следующий пример использует оператор индексирования для вывода первого символа строки:

>if (!s.empty())        // удостоверившись, что символ для вывода есть,

> cout << s[0] << endl; // вывести первый символ строки s

Прежде чем обратиться к символу, удостоверимся, что строка >s не пуста. При каждом использовании индексирования следует проверять наличие значения в данной области. Если строка >s пуста, то значение >s[0] неопределенно.

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

>string s("some string");

>if (!s.empty())        // удостовериться в наличии символа s[0]

> s[0] = toupper(s[0]); // присвоить новое значение первому символу

Вывод этой программы приведен ниже.

>Some string

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

В следующем примере переведем в верхний регистр первое слово строки >s:

>// обрабатывать символы строки s, пока они не исчерпаются или

>// не встретится пробел

>for (decltype(s.size()) index = 0;

> index != s.size() && !isspace(s[index]); ++index)

> s[index] = toupper(s[index]); // преобразовать в верхний регистр

Вывод этой программы таков:

>SOME string

Цикл >for (см. раздел 1.4.2) использует переменную >index для индексирования строки >s. Для присвоения переменной >index соответствующего типа используется спецификатор >decltype. Переменную >index инициализируем значением >0, чтобы первая итерация началась с первого символа строки >s. На каждой итерации значение переменной