Выбрать главу

"Мне нравится C++"

"#$%@@#$"

""

Строка, приведенная последней (""), называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.

Вам не нужно вручную добавлять в конец строковых констант нулевые символы. С++-компилятор делает это автоматически. Следовательно, строка "ПРИВЕТ" в памяти размещается так, как показано на этом рисунке:

Считывание строк с клавиатуры

Проще всего считать строку с клавиатуры, создав массив, который примет эту строку с помощью инструкции cin. Считывание строки, введенной пользователем с клавиатуры, отображено в следующей программе.

// Использование cin-инструкции для считывания строки с клавиатуры.

#include <iostream>

using namespace std;

int main()

{

 char str[80];

 cout << "Введите строку: ";

  cin >> str; // Считываем строку с клавиатуры.

 cout << "Вот ваша строка: ";

 cout << str;

 return 0;

}

Несмотря на то что эта программа формально корректна, она не лишена недостатков. Рассмотрим следующий результат ее выполнения.

Введите строку: Это проверка

Вот ваша строка: Это

Как видите, при выводе строки, введенной с клавиатуры, программа отображает только слово "Это", а не всю строку. Дело в том, что оператор ">>" прекращает считывание строки, как только встречает символ пробела, табуляции или новой строки (будем называть эти символы пробельными).

Для решения этой проблемы можно использовать еще одну библиотечную функцию gets(). Общий формат ее вызова таков.

gets(имя_массива);

Если в программе необходимо считать строку с клавиатуры, вызовите функцию gets(), а в качестве аргумента передайте имя массива, не указывая индекса. После выполнения этой функции заданный массив будет содержать текст, введенный с клавиатуры. Функция gets() считывает вводимые пользователем символы до тех пор, пока он не нажмет клавишу <Enter>. Для вызова функции gets() в программу необходимо включить заголовок <cstdio>.

В следующей версии предыдущей программы демонстрируется использование функции gets(), которая позволяет ввести в массив строку символов, содержащую пробелы.

// Использование функции gets() для считывания строки с клавиатуры.

#include <iostream>

#include <cstdio>

using namespace std;

int main()

{

 char str[80];

 cout << "Введите строку: ";

 gets(str); // Считываем строку с клавиатуры.

 cout << "Вот ваша строка: ";

 cout << str;

 return 0;

}

На этот раз после запуска новой версии программы на выполнение и ввода с клавиатуры текста "Это простой тест" строка считывается полностью, а затем так же полностью и отображается.

Введите строку: Это простой тест

Вот ваша строка: Это простой тест

В этой программе следует обратить внимание на следующую инструкцию.

cout << str;

Здесь (вместо привычного литерала) используется имя строкового массива. И хотя причина такого использования инструкции cout вам станет ясной после прочтения еще нескольких глав этой книги, пока кратко заметим, что имя символьного массива, который содержит строку, можно использовать везде, где допустимо применение строкового литерала.

При этом имейте в виду, что ни оператор ">>", ни функция gets() не выполняют граничной проверки (на отсутствие нарушения границ массива). Поэтому, если пользователь введет строку, длина которой превышает размер массива, возможны неприятности, о которых упоминалось выше. Из сказанного следует, что оба описанных здесь варианта считывания строк с клавиатуры потенциально опасны. Однако после подробного рассмотрения С++-возможностей ввода-вывода в главе 18 мы узнаем способы, позволяющие обойти эту проблему.