Циклы и текст
В уроке «Векторы» вы видели, что std::string — это последовательность символов типа char: word[0] — её первый символ, а word.size() — число символов. Поэтому по тексту можно проходить такими же циклами, как по вектору. С индексом:
std::string word = "Hello";
for (int i = 0; i < word.size(); i++) {
std::cout << word[i] << std::endl;
}Или циклом for по диапазону, где у переменной тип char:
std::string word = "Hello";
for (char character : word) {
std::cout << character << std::endl;
}Оба цикла выводят:
H
e
l
l
oПробел — тоже символ, поэтому для "Hi there" цикл выполнился бы 8 раз. А заглавные и строчные буквы — разные символы: 'H' == 'h' ложно. Слова в этом уроке английские: русская буква хранится в строке как два символа, а нам здесь нужны отдельные буквы.
Чтобы сравнить символ, напишите его в одинарных кавычках: character == 'l'. С двойными кавычками, character == "l", вы сравнили бы символ с текстом, и Clang сообщит error: comparison between pointer and integer ('char' and 'const char *').
Вывод в одной строке. До сих пор циклы выводили каждое значение в отдельной строке из-за std::endl. Без него следующий вывод продолжается в той же строке. Этот цикл выводит пробел после каждого символа, а строка заканчивается только один раз, после цикла:
std::string word = "Hello";
for (char character : word) {
std::cout << character << " ";
}
std::cout << std::endl;H e l l o Цикл с индексом может идти и назад: начните с последнего индекса, word.size() - 1, и считайте до 0 с помощью i--. Это вы попробуете в упражнении.
Задание
- 1
Пройдите по
textцикломforпо диапазону и выведите каждый его символ в отдельной строке. - 2
Под этим выведите текст задом наперёд, в одной строке. Пройдите по нему циклом с индексом, который начинается с последнего индекса,
text.size() - 1, и считает до0. В цикле выводитеtext[i]безstd::endl, а строку закончите с помощьюstd::endlпосле цикла. В выводе получитсяdesserts.