Sprawdzanie czy bufor klawiatury jest pusty

Sprawdzanie czy bufor klawiatury jest pusty
B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

Robię kontrolę poprawności wprowadzanych danych.
Używam

Kopiuj
cin.fail()

i cin.ignore

Kopiuj
 do czyszczenia bufora.
Problem jest jednak jak oczekuję liczby, a podam np. 10sgasga, wtedy wczytuje mi tą 10, a reszta jest śmieciem, który trzeba tak, czy siak usuwać, bo później wrzuca mi się to kolejne czytanie.
Chciałbym zrobić tak, żeby sprawdzać czy bufor jest pusty. Wtedt jeśli 
```cpp
cin.fail()==true

i bufor niejest pusty, to znaczy, że źle podano dane, i trzeba prosić jeszcze raz. Jak to zrobić? Może jest jakaś lepsza opcja?
Próbowałem robić z kbhit(), ale nie sprawdza to się. Tak samo

Kopiuj
cin.sync()

nie działa odpowiednio, muszę używać cin.ignore()

Kopiuj
.
carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Po każdym użyciu operatora >> czyść bufor strumienia.
Nawet jeśli NIE MA tam śmieci, zostaje w nim '\n'.
Pozostawienie znaku przejścia do nowej linii w buforze strumienia powoduje
problemy w użyciu np. std::getline().
Na strumieniu trzeba działać świadomie.

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

czyszczę obecnie

Kopiuj
cin.clear() 
 cin.ignore(100,'\n')

;
tak jest ok?

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
3
Kopiuj
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

A tak jak mówię, da radę jakoś zrobić, czy np. oprócz podanej liczby zostało coś w buforze za nią, i wtedy żeby wyrzucić użytkownikowi, że podał nie liczbę tylko "liczbonapis" ?

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Tak.

Kopiuj
int number;
std::cin >> number; // wprowadzasz 10abc
char ch;
while (std::cin.get(ch) && ch != '/n'){
    std::cout << ch; 
} // wypisze pozostałe abc 

Pomijanie:

Kopiuj
while (std::cin.get() != '/n')
    continue; 
Xupicor
  • Rejestracja: dni
  • Ostatnio: dni
0

Odnośnie tego błędu, to VS12 łyka:

Kopiuj
#include "stdafx.h"
#include <iostream>
#include <limits>

int _tmain(int argc, _TCHAR* argv[]) {
	using namespace std;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	return 0;
}

Więc... Spróbuj skompilować najkrótszy kod z tym cin.ignore(...) i wklej go tutaj jeżeli ciągle będzie sprawiał problemy. Podejrzewam, że to coś innego. ;)

"Liczbonapis" czyli np. "42foo"?

Kopiuj
    int i = 0;
    std::cin >> i;
    if (!std::cin) { // bad input! }
    // clean cin assumed here:
    if (std::cin.peek() != std::char_traits<char>::to_int_type('\n')) {
        std::string s;
        std::getline(std::cin, s);
        std::cout << "you typed \'" << s << "' after '" << i << "'\n";
    } else {
        std::cout << i << "\n";
    }

Ogółem - może zbieraj wszystko za pomocą std::getline i użyj stringstream'ów do walidacji?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.