Ввод C-строк с клавиатуры — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Ulysses (обсуждение | вклад) |
Ulysses (обсуждение | вклад) (→Противоречия << и cin::getline: << на >>) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
<source lang="cpp">int main() { | <source lang="cpp">int main() { | ||
− | const int SIZE = | + | const int SIZE = 127; |
− | char my_cstring[SIZE]; | + | char my_cstring[SIZE + 1]; // +1 - для нулевого байта |
− | cout << "Input string (" << SIZE | + | cout << "Input string (" << SIZE << " characters at most): "; |
− | cin.getline(my_cstring, SIZE); // прочтёт максимум SIZE | + | |
+ | cin.getline(my_cstring, SIZE); // прочтёт максимум SIZE символов и | ||
// автоматически добавит 0 в конце | // автоматически добавит 0 в конце | ||
cout << "The string was: " << endl << my_cstring << endl; | cout << "The string was: " << endl << my_cstring << endl; | ||
}</source> | }</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); // ввод строки