정수를 사용하는 프로그램이 있습니다. 사용자가 범위를 벗어난 번호 나 문자 등을 입력하면 프로그램이 붕괴되는 것을 어떻게 막을 수 있습니까?어떻게 cin을 살균합니까?
답변
기억 경우 aswell 확인 후 버퍼를 삭제해야해야 참조하십시오. 입력 스트림은 요청 된 데이터를 스트림에서 추출 할 수없는 경우 복구 할 수있는 오류를 나타냅니다. 오류 비트를 확인하려면 std::basic_istream::fail()
메서드를 사용해야합니다. 오류가 발생하면 true
을 반환하고 오류가 발생하면 false
을 반환합니다. 오류가있는 경우 데이터가 스트림에 남아 있으며 물론 오류 비트도 std::basic_istream::clear()
을 사용하여 지워야 함을 기억해야합니다. 또한 프로그래머는 잘못된 데이터를 무시해야합니다. 그렇지 않으면 다른 것을 읽으려는 시도가 다시 실패합니다. 이를 위해 std::basic_istream::ignore()
메서드를 사용할 수 있습니다. 유효한 값 범위는 수동으로 확인해야합니다. 좋아요, 충분한 이론은 여기에 간단한 예제가 있습니다 :
#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;
}
}
희망이 있습니다. 행운을 빕니다!
cin.good()
및 cin.fail()
을 사용하여 성공적으로 읽었는지 확인할 수 있습니다.
뭔가 당신이 내가 cin
의 기본 클래스 std::basic_istream
바로
if (cin.fail())
{
cout<<"need to put a number"<<endl;
cin.clear();
cin.ignore();
}
코드에 라이브러리를 추가하고 싶지 않으면 do..while() 문을 사용할 수도 있습니다. 을 입력하면 사용자 입력을 요청한 다음 변수에 수신 한 다음 while 부분에서 데이터를 계속 요청하지 않으면 예상되는 데이터인지 확인할 수 있습니다. 이미 언급 대답은 내가 문자열로 입력을 읽는 선호 적절하게
보다 더 많은 일을한다하더라도
또 다른 옵션 ..., 그리고 다음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";
}
}
}
추록 : 부스트에 알레르기가있는 경우이 lexical_cast 구현을 사용할 수 있습니다 :
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;
}
다시 던지기가없는 캐치 올 조항은 아니오입니다. –
설명하거나 인용문을 제공해 줄 수 있습니까? –
@VladLazarenko : 수정 됨. –
당신은 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;
}
while 루프는 올바른 입력을 취득 할 때까지 반복에 유지합니다. cin.clear()는 오류 제어 상태를 변경합니다. cin.ignore()는 입력 스트림을 지우고 새 입력을 다시 가져올 수 있도록합니다. while 루프는 무한 상태가됩니다.
- 1. 어떻게 워드 프레스에서 입력을 살균합니까
- 2. cin을 통해 입력되는 문자 수를 어떻게 제한합니까?
- 3. 어떻게 SQL 주입을 피하기 위해 PHP에서 데이터를 살균합니까?
- 4. cin을 문자열로 리디렉션
- 5. cin을 위해서만 숫자를 얻는
- 6. iostream cin을 올바르게 사용하려면 어떻게해야합니까?
- 7. cin을 두 번 읽는 방법?
- 8. 스칼라 앤orm 문자열 교체가 입력을 살균합니까?
- 9. Qt에서 cin을 사용할 수 있습니까?
- 10. cin을 사용하여 사용자로부터 완전한 라인을 읽는 방법?
- 11. cin을 사용하여 빈 줄을 테스트하는 방법
- 12. std :: cin을 사용한 후에 개행하지 않으려 고합니다.
- 13. C++ : cin을 ifstream 변수에 할당 하시겠습니까?
- 14. 개행 문자까지 공백을 사용하여 cin을 읽는 방법?
- 15. 또한 개식을 돌려주기 위해 cin을 수정하십시오.
- 16. Visual Studio에서 Labview CIN을 컴파일하려면 어떻게해야합니까?
- 17. cin을 사용하여 입력을 읽기 전에 cout을 플러시하는 이유는 무엇입니까?
- 18. fcgi 응용 프로그램에 cout 및 cin을 사용하는 이유는 무엇입니까?
- 19. C++에서 하나씩 cin을 읽는 방법은 무엇입니까? 요소 유형이 다릅니다
- 20. 지정한 시간이 지나면 std :: cin을 우회 할 수 있습니까?
- 21. C++에서 입출력 연산자를 오버로드 할 때 cout/cin을 사용합니까?
- 22. C++ 파일 리디렉션에서 end 행 char를 읽는 데 cin을 사용할 수 없습니다.
- 23. 버퍼 오버플로를 피하기 위해 Width()와 함께 C++에서 cin을 사용합니다.
- 24. cin을 사용하는 C++ 코드를 제대로 실행할 수있게 해주는 웹 사이트는 무엇입니까?
- 25. Boost :: asio :: write는 어떻게 작동합니까?
- 26. 이 스 니펫은 정수 입력의 유효성을 어떻게 검사합니까?
- 27. 어떻게 방해없이 cin과 cout을 동시에 사용할 수 있습니까?
- 28. while (cin >> x) 관용구에 '\ n'을 어떻게 포함시킬 수 있습니까?
- 29. 어떻게
- 30. 어떻게
http://www.parashift.com/c++-faq/istream-and-ignore.html – chris