2012-10-04 1 views
6

가능한 중복 :
how do I validate user input as a double in C++?C++, 어떻게 확인은 데이터 입력이 올바른 데이터 형입니다

나 C++에 새로운 오전, 나는 내가하는 기능을 가지고 사용자가 double 값을 입력하도록합니다. 값 입력이 올바른 데이터 유형인지 확인하는 방법은 무엇입니까? 또한 오류는 어떻게 처리됩니까? 내가 {} 캐치()는 {},하지만 난이 문제에 대한 그 것 적합한 솔루션을 생각하지 않는 시도`사용

if(cin >> radius){}else{} 

: 지금이 순간이 내가 가진 전부입니다. 어떤 도움을 주시면 감사하겠습니다.

+4

이 꽤 잘 작동합니다 http://www.parashift.com/c++-faq/istream-and-ignore.html – chris

+1

문자열로 읽고 정규식을 사용하여 구문 분석합니다. – rplusg

답변

13

ostream& operator>>(ostream& , T&)이 형식화 된 데이터 (정수, double, float 등) 추출에 실패하면 stream.fail()이 참이므로 !stream도 true로 평가됩니다.

그래서 당신은 사용할 수 있습니다

cin >> radius; 
if(!cin){ 
    cout << "Bad value!"; 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cin >> radius; 
} 

또는 그대로 operator>> 더 이상 스트림에서 데이터를 추출 할 것이기 때문에 단순히

while(!(cin >> radius)){ 
    cout << "Bad value!"; 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 

그것은 ignore 라인의 나머지 부분에 중요하다 잘못된 형식으로. 따라서 제거하는 경우

cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

입력이 표준 입력에서 지워지지 않으므로 루프가 끝나지 않습니다.

은 참조 :

+1

'sream.good()'는 입력이 정확하더라도 false 일 수 있습니다. 부울 컨텍스트에서 스트림을 사용할 때 false는'stream.fail()'이고, true는'! stream.fail()'입니다. 'stream.good()'는 결코 들어 가지 않습니다. 포스터의 문제와 관련하여'istream :: good'에 대한 어떤 언급도 잘못되었습니다. –

+3

올바른 형식이 아닌 경우'operator >>'는 스트림에서 데이터를 추출하지 않습니다. _some_ 데이터를 추출 할 수 있습니다. (''1.2e + x "'라인의 입력을 생각해 보라.스트림은 한 문자 사전 검색을 보장하며''x ''가 나타날 때까지 오류를 감지 할 수 없습니다. 이전의 모든 문자가 추출됩니다.) –

+0

@JamesKanze : 두 가지 의견 모두에서 문제를 해결하려고했지만 조금 어색한 느낌이 들었습니다. 나중에 다른 오류를 발견하면 편집하고 의견을 남길 수 있습니다. 새로운 것을 배울 때 항상 즐겁습니다. :). – Zeta

3

std::getlinestd::string을 사용하여 전체 줄을 읽어야합니다. 즉, 전체 라인이 올바른 데이터 유형의 것을 완전히 확인하는 방법입니다 :

std::string line; 
while(std::getline(std::cin, line)) 
{ 
    std::stringstream ss(line); 
    if ((ss >> radius) && ss.eof()) 
    { 
     // Okay break out of loop 
     break; 
    } 
    else 
    { 
     // Error! 
     std::cout << "Invalid input" << std::endl; 
    } 
} 
0

이 예제는 그러나 당신이 INT 더블 구별 할 수 없습니다이 방법으로, 자기 설명이다.

int main() 
{ 
    double number = 0; 

    if (!(std::cin >> number)) 
    { 
    std::cout << "That's not a number; "; 
    } 
    else 
    { 
    std::cout << "That's a number; "; 
    } 
} 
+2

어 음 그럼, 그들이 0으로 들어가면 어떨까요? 또는 이것은 ints 부분과 함께 작동하지 않을 것입니다 .. – StarWind0

관련 문제