Powiedz, że mam program, który przyjmuje liczby całkowite. Jak zatrzymać program przed rozpadem, jeśli użytkownik wprowadzi numer spoza zakresu lub literę lub coś takiego?Jak zdezynfekować Cin?
Odpowiedz
klasa bazowy cin
„s jest std::basic_istream
. Strumień wejściowy wskazuje możliwy do naprawienia błąd w przypadku, gdy nie może wyodrębnić żądanych danych ze strumienia. Aby sprawdzić ten bit błędu, należy użyć metody std::basic_istream::fail()
- zwraca ona true
, jeśli wystąpiła awaria lub false
, jeśli wszystko jest w porządku. Należy pamiętać, że w przypadku wystąpienia błędu dane pozostają w strumieniu i oczywiście bit (y) błędu należy również wyczyścić, używając std::basic_istream::clear()
. Ponadto programista musi zignorować niepoprawne dane lub w przeciwnym razie próba odczytania czegoś innego zakończy się niepowodzeniem. W tym celu można zastosować metodę std::basic_istream::ignore()
. Jeśli chodzi o prawidłowy zakres wartości, należy go sprawdzić ręcznie. Okay, dość teorii, oto prosty przykład:
#include <limits>
#include <iostream>
int main()
{
int n = 0;
for (;;) {
std::cout << "Please enter a number from 1 to 10: " << std::flush;
std::cin >> n;
if (std::cin.fail()) {
std::cerr << "Sorry, I cannot read that. Please try again." << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
continue;
}
if (n < 1 || n > 10) {
std::cerr << "Sorry, the number is out of range." << std::endl;
continue;
}
std::cout << "You have entered " << n << ". Thank you!" << std::endl;
break;
}
}
Mam nadzieję, że to pomaga. Powodzenia!
Możesz sprawdzić, czy odczyt się powiódł, czy nie, z cin.good()
i cin.fail()
.
coś takiego powinien zrobić trzeba wyczyścić bufor po sprawdzeniu aswell jeśli dobrze pamiętam
if (cin.fail())
{
cout<<"need to put a number"<<endl;
cin.clear();
cin.ignore();
}
Jeśli nie chcesz dodawać bibliotek do swojego kodu, możesz również użyć instrukcji do..while(). w swoim życiu, podczas gdy poprosisz o dane wejściowe użytkownika, a następnie otrzymasz je do zmiennej, a następnie w części while będziesz mógł sprawdzić, czy są to dane, których się spodziewasz, jeśli nie będziesz dalej pytać o dane.
prostu innej opcji .... mimo, że odpowiedź już wspomniano powinien pracować więcej niż odpowiednio
Wolę czyta wejście jako ciągi i następnie odkażania im boost::lexical_cast<>
:
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>
int main() {
std::string s;
while(std::cin >> s) {
try {
int i = boost::lexical_cast<int>(s);
std::cout << "You entered: " << i << "\n";
} catch(const std::bad_cast&) {
std::cout << "Ignoring non-number: " << s << "\n";
}
}
}
Postscriptum: Jeśli masz uczulenie na Boost, możesz użyć tej implementacji leksykalnej:
template <class T, class U>
T lexical_cast(const U& u) {
T t;
std::stringstream s;
s << u;
s >> t;
if(!s)
throw std::bad_cast();
if(s.get() != std::stringstream::traits_type::eof())
throw std::bad_cast();
return t;
}
Klauzula catch-all bez ponownego rzutu jest nie-nie. –
Czy możesz to wyjaśnić lub podać cytat? –
@ VladLazarenko: Naprawiono. –
Można użyć następującego kodu do najprostszego i szybkiego sprawdzenia ważnego wkładu w int:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int intb;
while(!(cin>>intb)){
cin.clear();
cin.ignore (1000, '\n');
cout<<"Invalid input enter again: "<<endl;
}
cout<<"The value of integer entered is "<<b<<endl;
return 0;
}
pętli while utrzymuje się na iterację aż dostaje prawo wejścia. cin.clear() zmienia stan kontroli błędów. cin.ignore() usuwa usuwanie strumienia wejściowego, dzięki czemu można ponownie pobierać nowe dane wejściowe. Jeśli nie zrobisz tego, pętla będzie w nieskończonym stanie.
- 1. Szyny Gem zdezynfekować - Jak do białej i
- 2. Jak to zrobić bez użycia zdezynfekować SQL przygotowanych sprawozdań
- 3. Jak ograniczyć liczbę znaków wprowadzanych przez cin?
- 4. Uzyskiwanie klawiszy strzałek od cin
- 5. C++ Cout & Cin & System "Niejednoznaczny"
- 6. Alternatywne cin/cout jest wolne?
- 7. Wstrzykiwanie łańcucha znaków do 'cin'
- 8. getchar_unlocked() VS scanf() VS cin
- 9. Przekierowanie cin do łańcucha znaków
- 10. ng-bind-html - z kątowym-zdezynfekować - rzuca błąd w konsoli
- 11. Odpowiednik w języku Java dla cin (C++)
- 12. Ignorując/pomijanie znaków za pomocą std :: cin
- 13. tell cin przestać czytać w nowej linii
- 14. Uzyskiwanie danych wejściowych z konsoli bez cin?
- 15. czytanie „unsigned int” za pomocą „cin”
- 16. Wpływ noskipws na cin >>
- 17. C++: używanie cin na proces potomny
- 18. Jak iterować po linii cin po linii w C++?
- 19. Jak wprowadzić zmienne przy użyciu cin bez tworzenia nowego wiersza?
- 20. Czyszczenie wejścia cin: czy cin.ignore nie jest dobrą metodą?
- 21. C++ bufory cout i cin oraz bufory ogólnie
- 22. Dobra pętla sprawdzania danych wejściowych przy użyciu cin - C++
- 23. Dlaczego musimy wiązać std :: cin i std :: cout?
- 24. Co oznacza "c" w cout, cin, cerr i clog?
- 25. Co to jest C równoważne z wyrażeniem C++ cin?
- 26. Co to jest cin analougus sformatowanego wejścia scanf?
- 27. Jak odczytywać cin z białymi znakami aż do znaku nowej linii?
- 28. W jaki sposób cin ocenia się jako prawdziwe, gdy znajduje się wewnątrz instrukcji if?
- 29. Dlaczego użycie cin, cout lub% I64d jest preferowane w porównaniu z% lld specyfikatorem w C++?
- 30. Czy drugi warunek w (cin >> buf &&! Buf.empty()) jest nadmiarowy?
http://www.parashift.com/c++-faq/istream-and-ignore.html – chris