2012-02-19 5 views
1

Вот у меня есть код:Cin.Ignore() не работает

cout << "Press Enter To Exit..."; 
cin.ignore(); 

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

int m; 
cin >> m; 
cout << "Press Enter To Exit..."; 
cin.ignore(); 

на этот раз после ввода номера для сохранения в «м» программа выйдет, не дожидаясь команды cin.ignore, которая ждет нажатия ENTER.

Я имею в виду, если вы используете команду cin перед cin.ignore, команда cin.ignore пропустит. Зачем? и что я должен сделать для его исправления?

ответ

0

Используйте это.

std::cin.sync(); std::cin.get(); 
+0

Спасибо за ваш ответ. Кроме того, я могу просто использовать cin.ignore(); два раза, и это решит проблему, примерно так: cout << "Нажмите Enter To Exit ..."; cin.ignore(); cin.ignore(); – Nofuzy

+0

Если во входном буфере нет ничего, пользователь должен будет ввести два символа для работы, тогда как 'sync' очищает все левые и затем' get' считывает, пока пользователь не попадет в enter. – chris

+0

['cin.sync()' отбрасывание необработанного ввода зависит от MSVC] (http://en.cppreference.com/w/cpp/io/basic_istream/sync#Notes). – xskxzr

1

Использование

int m; 
cin >> m; 
cin.ignore(); 

cout << "Press Enter To Exit..."; 
cin.ignore(); 
1

при использовании cin >> m вы наберете значение м, а затем нажмите клавишу ВВОД, ввода '\n' переходит в буфер и cin.ignore(); игнорирует его и программа завершается.

4

cin.ignore() в основном очищает любые входы, оставшиеся в памяти. В первом фрагменте кода вы ничего не вводили, поэтому ему нечего будет очищать, и из-за этого он ждет, чтобы вы что-то вносили. Во втором фрагменте кода вы использовали оператор >>, который получает сформированный ввод, но оставляет символ конечной линии '\n' (тот, который хранится при нажатии ENTER), блуждающий во входном буфере. Когда вы вызываете cin.ignore(), он выполняет это задание и очищает тот же самый буфер. Поскольку он уже сделал то, к чему он был вызван, он просто позволяет программе продолжить (в этом случае до конца). Помните, что cin.ignore() предназначен для очистки входного буфера (небольшой фрагмент памяти, который содержит вход), если вы хотите, чтобы пользователь вводил что-то до того, как программа двигается при использовании cin.get().

Вы также должны знать это:

При использовании:

->cin<< вы должны вызвать cin.ignore() после этого, потому что он не потребляет символ конца строки «\ п», которая будет потребляться в следующий раз, когда вы попросите ввести причину нежелательных результатов , таких как программа, не дождавшись, когда вы что-нибудь введете.

->cin.get() вы не должны вызывать cin.ignore(), так как он потребляет «\ п»

->getline(cin,yourstring) (получает целую строку ввода, включая линии символа конца), вы также не должны использовать КИН. ignore()

+0

Спасибо за ваш полный ответ, знаете ли вы, что лучший способ нажать enter для выхода? – Nofuzy

+1

№. Насколько я знаю, cin.get() - лучший кросс-платформенный вариант. (все-таки я не C++ pro). –

+0

Спасибо. Я искал и пробовал много вариантов. Этот ответ очищает все путаницы. – PdotWang