2011-02-15 3 views
1

사용자 입력 값을 받아들이는 requirment가 있습니다. 정수 또는 문자열 일 수 있습니다. 사용자 입력은 다음과 같이 허용됩니다.C++에서 올바른 값에 대한 사용자 입력 확인

string strArg; 
cout << "Enter price value " << endl; 
std::getline(std::cin, strArg); 
int input; 
std::stringstream(strArg) >> input; 

질문은 내가 즉, 우측 입력 확인, 사용자가 오히려 문자열보다 정수를 입력했습니다 확인합니까 방법이다. C++에서 이식 가능한 방식으로 어떻게 할 수 있습니까? 내 매니저는 그것을 사용 :)에서 행복하지 않다으로 내 프로젝트 부스트가 허용되지 않는 마찬가지로

+0

기존 라이브러리가 만족스럽지 않으면 직접 라이브러리를 만들어 사용해야합니다. –

+0

마지막 줄에서'strArg'를'input'으로 변경 했으므로 예제가 깨졌습니다. 그리고'RtsString'은 C++이 아닙니다. –

답변

1

뭔가 할 에게서는 정규 표현식의 지원이 있습니다

#include <iostream> 
#include <sstream> 
#include <string> 

int main(void) 
{ 
    std::cout << "input:" << std::endl; 
    std::string input; 
    std::getline(std::cin, input); 

    std::istringstream str(input); 
    int iv = 0; 
    // this checks that we've read in an int and we've consumed the entire input, else 
    // treat as string. 
    if (str >> iv && str.tellg() == input.length()) 
    { 
    std::cout << "int: " << iv << std::endl; 
    } 
    else 
    { 
    std::cout << "string: " << input << std::endl; 
    }  

    return 0; 
} 
+0

u pls eloborate, 그게 우리가 전체 입력을 소비하는 경우 그것은 int입니다, 그렇지 않으면 그것은 문자열입니다. 문자열에 대해 우리는 전체 입력을 소비하지 않습니다. – venkysmarty

+0

어? 주어진'input' 문자열에서, 위의 검사는 int ('iv')에서 읽은 문자열이 전체 문자열을 소비했는지 확인합니다. 그렇다면'int'로 간주하고, 그렇지 않으면'string'입니다. 'int','iv'는 정수 값을 포함하고, 그렇지 않으면'input'은 문자열 값을 포함합니다. 체크는 다음과 같은 경우를 처리합니다 :'123foo', this is string or int? 'str >> iv'를했다면,'iv = 123'을 얻을 것입니다. 어쨌든 - 이것은 업무 관련 문제처럼 보이지 않습니다. 솔직히 말해서이 숙제입니까? – Nim

+0

도움에 감사드립니다. 내 다른 질문은 위의 논리는 int 값에 대해 fooabc를 처리합니다. 이것은 숙제가 아닙니다. 이것은 직장에서의 요구 사항의 일부입니다. 그리고 또 다른 요점은 컴파일 오류를 확인하는 경우 tellg은 길이를 확인할 수 없다는 것입니다. – venkysmarty

0

부스트 :: lexical_cast이 일을 같은 apprximately 동일합니다 : 당신은 그것을 확인하기 위해 정규 표현식을 사용할 수 있습니다

std::stringstream i; i << strArg; 
int k; i >> k; 
+0

여기서 올바른 입력을 확인하는 방법은 무엇입니까? 수 있습니다 예외로 – venkysmarty

+1

el plor 수 있습니다. 'boost :: lexical_cast'를 찾아서 documentation/examples을 따르십시오. –

0

. 지금까지 내가 아는 한, 새로운 C++의 standart 이런

+1

예, 아직 표준이 아닙니다. 프로덕션 코드에서 사용하면 어리석은 일입니다. –

1

사용 std::stringstream and operator>> 및 변환이 성공적으로 완료되었는지 확인합니다. 이 같은


뭔가 :

#include <iostream> 
#include <sstream> 


int main() 
{ 
    std::stringstream ss; 

    ss << "1234"; 

    int a = 0; 
    ss >> a; 
    if (ss.fail()) 
    { 
     std::cout << "it is not a number" << std::endl; 
    } 
    else 
    { 
     std::cout << a << std::endl; 
    } 
} 
+0

유 pls는 우리가 이것을 어떻게 사용할 수 있습니까? – venkysmarty

+3

@ user519882 : VJo가 링크 된 페이지의 예제를 살펴보아야합니다. 프로그래밍에는 약간의 노력이 필요합니다. (cplusplus.com은 언어를 처음 사용하는 사람들에게 좋은 자료는 아니지만.) –

+0

@ user519882 물론 예를 추가했습니다. 문자열을 변경하고 출력 내용을 확인하십시오. –

1

이 당신이 사용자가 유효하지 않은 뭔가를 입력하면이를 취소 할 필요가 없습니다 제외하고는 이제 stringstream을 통과 할 진짜 이유가 없다, 게다가 당신이 그들에게 다시 에코 할 수 있습니다 ..

int arg; 
while(! (cin >> arg)) 
{ 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

    // tell the user their value was invalid 
} 

// now we have a valid number 

당신은 사용자가 정수 또는 문자열을 입력하지만 물론 사용 istringstream의 당신이 할 수있는 문자열 인 경우 만 다르게 작동 할 수있는 경우

.

사용자가 123XYZ를 입력 한 경우 숫자를 읽은 다음 스트림이 비어 있는지 확인할 수 있습니다.이 스트림은 방금 전에 스트리밍 된 경우 정수로 시작되므로 "유효한"것으로 간주됩니다.

관련 문제