Ввод C-строк с клавиатуры — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Новая страница: «int main() { const int SIZE = 8; char my_cstring[SIZE]; cout << "Input string (" << SIZE - 1 << " characters at most):" << endl; cin.getline(my_cstri…»)
 
(Противоречия << и cin::getline: << на >>)
 
(не показано 6 промежуточных версий этого же участника)
Строка 1: Строка 1:
int main() {
+
<source lang="cpp">int main() {
     const int SIZE = 8;
+
     const int SIZE = 127;
     char my_cstring[SIZE];
+
     char my_cstring[SIZE + 1];     // +1 - для нулевого байта
     cout << "Input string (" << SIZE - 1 << " characters at most):" << endl;
+
     cout << "Input string (" << SIZE << " characters at most): ";
     cin.getline(my_cstring, SIZE);
+
   
 +
     cin.getline(my_cstring, SIZE); // прочтёт максимум SIZE символов и
 +
                                  // автоматически добавит 0 в конце
  
 
     cout << "The string was: " << endl << my_cstring << endl;
 
     cout << "The string was: " << endl << my_cstring << endl;
}
+
}</source>
 +
 
 +
==== Противоречия >> и cin::getline ====
 +
Проблемы возникают при последовательном применении операций >> и getline:
 +
<source lang="cpp">cin >> n; // ввод целого числа
 +
cin.getline(my_cstring, SIZE); // ввод строки - !!! ошибка !!! </source>
 +
В данном примере в my_string всегда будет записана пустая строка, причём пользователю даже не дадут возможности ввести какую бы то ни было строку.
 +
 
 +
Причина ошибки состоит в том, что при вводе целого числа при нажатии клавиши Enter в потоке остаётся символ перехода на новую строку. Операция >> считывает число, но оставляет этот символ в потоке. Последующий вызов getline «увидит» символ перехода на новую строку и посчитает, что таким образом была введена пустая строка.
 +
 
 +
Избежать ошибки можно принудительно удалив символ перехода на новую строку с помощью вызова операции cin::ignore:
 +
<source lang="cpp">cin >> n; // ввод целого числа
 +
cin.ignore(); // удаление очередного символа в потоке
 +
cin.getline(my_cstring, SIZE); // ввод строки </source>
  
 
[[Категория:C++]]
 
[[Категория:C++]]

Текущая версия на 12:02, 29 ноября 2012

int main() {
    const int SIZE = 127;
    char my_cstring[SIZE + 1];     // +1 - для нулевого байта
    cout << "Input string (" << SIZE << " characters at most): ";
    
    cin.getline(my_cstring, SIZE); // прочтёт максимум SIZE символов и
                                   // автоматически добавит 0 в конце

    cout << "The string was: " << endl << my_cstring << endl;
}

Противоречия >> и cin::getline

Проблемы возникают при последовательном применении операций >> и getline:

cin >> n; // ввод целого числа
cin.getline(my_cstring, SIZE); // ввод строки - !!! ошибка !!!

В данном примере в my_string всегда будет записана пустая строка, причём пользователю даже не дадут возможности ввести какую бы то ни было строку.

Причина ошибки состоит в том, что при вводе целого числа при нажатии клавиши Enter в потоке остаётся символ перехода на новую строку. Операция >> считывает число, но оставляет этот символ в потоке. Последующий вызов getline «увидит» символ перехода на новую строку и посчитает, что таким образом была введена пустая строка.

Избежать ошибки можно принудительно удалив символ перехода на новую строку с помощью вызова операции cin::ignore:

cin >> n; // ввод целого числа
cin.ignore(); // удаление очередного символа в потоке
cin.getline(my_cstring, SIZE); // ввод строки