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
}
}

любая проблема, дайте мне знать.