Como eu limpo o buffer cin em C ++?
Como eu limpo o buffer cin em C ++?
Respostas:
Possivelmente:
std::cin.ignore(INT_MAX);
Isso iria ler e ignorar tudo até EOF
. (você também pode fornecer um segundo argumento que é o caractere a ser lido até (ex: '\n'
para ignorar uma única linha).
Além disso: você provavelmente também deseja fazer um: std::cin.clear();
antes disso para redefinir o estado do fluxo.
Eu preferiria as restrições de tamanho C ++ em vez das versões C:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
e usar a primeira instrução acima para liberar o cin
buffer, ele continuará solicitando a entrada até que eu entre EOF
pressionando ctrl+d
?
cin.clear();
fflush(stdin);
Esta foi a única coisa que funcionou para mim ao ler do console. Em todos os outros casos, ele seria lido indefinidamente devido à falta de \ n ou algo permaneceria no buffer.
EDIT: Eu descobri que a solução anterior piorou as coisas. ESTE, entretanto, funciona:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Eu encontrei duas soluções para isso.
O primeiro, e mais simples, é usar, std::getline()
por exemplo:
std::getline(std::cin, yourString);
... isso descartará o fluxo de entrada quando chegar a uma nova linha. Leia mais sobre esta função aqui .
Outra opção que descarta diretamente o stream é esta ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Boa sorte!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
E se:
cin.ignore(cin.rdbuf()->in_avail());
Eu prefiro:
cin.clear();
fflush(stdin);
Há um exemplo em que cin.ignore simplesmente não funciona, mas não consigo pensar nele no momento. Já faz um tempo que precisei usá-lo (com o Mingw).
No entanto, fflush (stdin) é um comportamento indefinido de acordo com o padrão. fflush () serve apenas para fluxos de saída. fflush (stdin) só parece funcionar como esperado no Windows (com CCG e MS compiladores pelo menos) como uma extensão para o padrão C .
Portanto, se você usá-lo, seu código não será portátil.
Consulte Usando fflush (stdin) .
Além disso, consulte http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 para obter uma alternativa.
Outra solução possível (manual) é
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Não consigo usar fflush ou cin.flush () com CLion, então isso foi útil.
Caminho mais fácil:
cin.seekg(0,ios::end);
cin.clear();
Ele apenas posiciona o ponteiro cin no final do fluxo stdin e cin.clear () limpa todos os sinalizadores de erro, como o sinalizador EOF.
O seguinte deve funcionar:
cin.flush();
Em alguns sistemas não está disponível e você pode usar:
cin.ignore(INT_MAX);
flush
método é apenas para saída e lida com caracteres já escritos.
basic_istream<char>' has no member named 'flush'
cin.get()
parece liberá-lo automaticamente de maneira bastante estranha (embora provavelmente não seja preferido, já que isso é confuso e provavelmente temperamental).
Funcionou para mim Eu usei o loop for com getline ().
cin.ignore()