Ввод строки

Числа и символы мы вводить научились, теперь попробуем ввести строку:

// #include <process.h>
system("chcp 1251"); // Смена кодировки консоли
std::setlocale(LC_ALL, "Russian_Russia.1251");
char str[255] = {0};
std::cout << "Введите строку: ";
std::cout.flush();
std::cin >> str;
std::cout << '\'' << str << '\'' << std::endl;

Сначала изменяется кодировка консоли и настраивается локаль. Строка, которую мы получим по умолчанию, будет в кодировке консоли (например, в кодировке windows-866 или какой-либо другой). Чтобы получить строку в кодировке windows-1251, мы передаем команду смены кодировки chcp 1251 функции system(). Чтобы использовать функцию system() следует подключить заголовочный файл process.h.

Далее объявляется символьный массив, состоящий из 255 символов. Строки в языке C++ представляют собой последовательность (массив) символов, последним элементом которого является нулевой символ ('\0'). Обратите внимание на то, что нулевой символ (нулевой байт) не имеет никакого отношения к символу '0'. Коды этих символов разные. Затем выводится подсказка пользователю и сбрасывается буфер. Далее объекту cin передается указатель на первый элемент массива str. Если в окне консоли ввести строку "Hello, world!" и нажать клавишу <Enter>, то массив str будет содержать значение "Hello,\0". Фрагмент "world!" останется в буфере, так как символ пробела является символом-разделителем.

Чтобы получить определенное количество символов необходимо воспользоваться методом getline() объекта cin. Прототипы метода:

istream &getline(char *str, streamsize count);
istream &getline(char *str, streamsize count, char delim);

В первом параметре задается указатель на строку, а во втором параметре максимальное количество символов. В параметре delim можно дополнительно указать символ-ограничитель. Метод, соответствующий первому прототипу, производит считывание count-1 символов. Если раньше встретится символ перевода строки (\n), то считывается фрагмент до этого символа. Символ перевода строки считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода. Пример использования метода getline() приведен листинге 2.8.

Метод, соответствующий второму прототипу, производит считывание count-1 символов. Если раньше встретится символ delim, то считывается фрагмент до этого символа. Символ delim считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода.

Количество записанных в массив символов можно получить с помощью метода gcount() объекта cin. Прототип метода:

streamsize gcount() const;

Листинг 2.8. Ввод строки

#include <iostream>
#include <clocale>
#include <process.h>

int main() {
   system("chcp 1251"); // Смена кодировки консоли
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   char str[255] = {0};
   std::cout << "Введите строку: ";
   std::cout.flush();
   std::cin.getline(str, 255);
   std::cout << '\'' << str << '\'' << std::endl;
   std::cout << std::cin.gcount() << std::endl;
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов