2016-02-02 3 views
-1

Рассмотрим следующий код:Как правильно очистить входной буфер после того, как я получу следующий символ, не нажимая дважды? C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    char input; 
    while (1) { 
     cout << "Enter: "; 
     cin.get(input); 
     cin.ignore(100, '\n'); //requires another `enter` 
    } 
    return 0; 
} 

Я хочу, чтобы получить следующий символ в буфер ввода, и я хочу, чтобы входной буфер будет очищен после этого. Я знаю, что мы можем использовать cin.ignore(), чтобы сделать очистку, однако, если бы я использовал его, то мне нужно будет дважды нажать ввод (в случае ввода enter) для ввода моего ввода! Как я могу предотвратить это?

+0

почему не делать, если (вход == '\ п') продолжить; вместо игнорирования? –

+0

Вы не можете «очистить» входной буфер, вы должны каким-то образом использовать символы. – wilx

+1

@Pierre: Это неправильно. См. Http://stackoverflow.com/a/2979217/341065. – wilx

ответ

1
#include <iostream> 
using namespace std; 
int main() 
{ 
    char input; 
    while (1) 
    { 
     cout << "Enter: "; 
     cin.get(input); 
     cout << input << endl; 
     cin.ignore(255, '\n'); 
     cin.clear(); 
    } 
    return 0; 
} 

вам нужно очистить CIN флаги: cin.clear();

+0

Это не решит проблему! – Anich1935

+0

Какая ОС вы используете, кстати? – Axios

+0

Я использую Linux – Anich1935

0

std::cin.ignore() будет блокировать до тех пор, пока он не будет читать цифры count или не видит его delimiter. Нет надежного способа проверить, будет ли блокироваться std::cin, прежде чем вызывать функцию ввода. Единственный надежный способ предотвратить его блокировку, когда input == '\n' должен проверить это условие перед вызовом ignore().

#include <iostream> 
#include <limits> 

int main() 
{ 
    char input; 
    while (true) { 
     std::cout << "Enter: "; 
     std::cin.get(input); 
     if (input != '\n') { 
      // Note: using std::numeric_limits<std::streamsize>::max() 
      // disables std::istream::ignore's count check entirely 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
    } 
} 
1

Обходной в этом случае может быть использование std::string и std::getline:

#include <iostream> 
#include <string> 

int main() 
{ 
    while(true) 
    { 
     std::cout << "Enter: " << std::flush; 
     std::string input; 

     if(std::getline(std::cin, input) && !input.empty()) 
     { 
      input.front(); // this is your character 
     } 
    } 

    return 0; 
} 
+1

Небольшая сторона этого заключается в том, что он излишне распределяет память. Но на стороне это простой код. –