C++: как проверить, пуст ли буфер cin?
Как вы проверяете, не ввел ли пользователь что-либо по команде cin и просто нажал enter?
4 ответов
при чтении из std:: cin, предпочтительно не использовать оператор по добыче поток >>
как это может иметь все виды неприятных побочных эффектов. Например, если у вас есть этот код:
std::string name;
std::cin >> name;
и я вхожу John Doe
, затем строка для чтения из cin
будет просто держать значение John
, оставив Doe
позади, чтобы быть прочитанным некоторой будущей операцией чтения. Точно так же, если бы я написал:
int myInteger;
std::cin >> myInteger;
и затем я набираю John Doe
, потом cin
войдет в состояние ошибки и откажется выполнять любые будущие операции чтения, пока вы явно не очистите его состояние ошибки и не очистите символы, вызвавшие ошибку.
лучший способ сделать пользовательский ввод-использовать std:: getline для чтения символов с клавиатуры, пока пользователь не нажмет enter. Например:
std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.
ADL означает поиск, зависящий от аргумента. Теперь, если я войду John Doe
, стоимостью name
будет John Doe
и не останется никаких данных в cin
. Кроме того, это также позволяет проверить, если пользователь просто нажал Enter:
std::string name;
getline(std::cin, name);
if (name.empty()) {
/* ... nothing entered ... */
}
недостатком этого подхода является то, что если вы хотите читать в форматируемой строке данных int
или double
вам придется разобрать представление из строки. Я лично думаю, что это стоит того, потому что это дает вам более мелкозернистый контроль над тем, что делать, если пользователь вводит что-то недопустимое и "охраняет" cin
от неудача.
Я преподаю курс программирования на C++ и имею некоторые конспекты лекций о библиотеке потоков это входит в достаточное количество деталей о том, как читать форматированные данные из cin
безопасным способом (в основном в конце главы). Я не уверен, что вы найдете это полезным, но в случае, если это полезно, я думал, что опубликую ссылку.
надеюсь, что это помогает!
cin не будет продолжать работу с программой, если пользователь не введет хотя бы 1 символ (enter не считается). Если пользователь не дает никакого ввода, cin будет просто ждать, пока пользователь даст ввод, а затем нажмите enter.
простой способ >>
{
char X=0; // ASCII( 0 ) means a NULL value
cin>>X;
if(X==0 || X==10) // ASCII( 10 ) means ENTER
cout<<"User din't enter ANYTHING !! ";
}
но есть простая проблема....
cin просто не позволит вам двигаться дальше без ввода символа
под символом здесь я имею в виду цифру или алфавит или специальный символ , а не пробел, введите null и т. д.
надеюсь, что это решит вашу проблему, если это не так, я буду рад помочь, просто дайте мне знать.
int main(){
string str[100];
std::cout<<"Hello how are you ? \n";
std::cin>>str;
if(str.length() > 0){
// If input is seen
}
else{
// If input is not seen
}
}
любая проблема, дайте мне знать.