2012-04-23 1 views
0

사용자가 입력하는 입력 유형을 확인해야하며 원하는 유형이 아닌 경우 오류 메시지를 인쇄해야합니다. 내 코드는 다음과 같습니다Qt에서 C++로 유형을 확인하는 방법

int ClassInput::inputInt(QString str) 
{ 
    signed int l; 
    std::cout << str.toStdString(); 
    std::cin>>l; 

    while(!l) 
    { 
     eh.handleError(1); 
     std::cin>>l; 
     cin.clear(); 
     cin.ignore (1000, '\n'); 
    } 
    return l; 
} 

하지만 문제는 부동 소수점 값이 입력 될 때 오류 메시지가 인쇄되지이다. 또한, 오른쪽 입력이 입력 된 것처럼 다음 단계로 진행하여 계산을 수행합니다.

때로는 오류 문을 무한히 인쇄합니다. 누구든지 내 코드를 수정할 수 있습니까?

+0

당신은 문자열로 입력을 읽어야한다고 생각하고 그것을 확인할 수 있습니다 ... hm if (! sscanf (in_str.c_str(), "% d", & some_int_var)) {error(); } 내 pov에서 "std :: cin >>"어떤 문자열 (항상 확실하지 않음)과 함께 항상 작동합니다. 또한 "if (! (std :: cin >> l)) {error();}" – user928204

+0

을 입력 할 수 있습니다. 안전하게 입력하려면 입력에서 std :: string을 가져와 구문 분석해야합니다. – k06a

+1

사용자가 유형을 입력하지 않고 특정 형식으로 값을 입력하면 형식이 사용자의 기대치와 일치하는지 확인해야합니다. – stefan

답변

1

나는 typeinfo을 찾고 있습니다. 이것은 사용자가 예상 한 입력으로 int의 경우에 대한 예제 코드 일 수 있습니다.

std::cin>>l; 
QString input = typeid(l).name(); 
if(input.compare("int")) continue; 
+0

이것은 완전히 잘못되었습니다. 'l'은 항상 int입니다. 그리고, int 형이 캐릭터 라인 "int"에 의해 나타내지는 않는다고는 할 수 없습니다. 구현에 의존합니다. –

1

귀하의 문제는 유형 검사가 아니라 값 확인에 관한 것입니다. 따라서 typeid은 실제로 좋은 선택이 아닙니다.

특히 문제를 해결하는 방법에 대해 설명합니다. 입력시 더 엄격한 값 확인을 추가해야합니다. 사용자 변수를 int 변수에 저장하는 것은 좋지 않습니다. 왜냐하면 사용자가 float 변수를 입력하면 암시 적으로 int로 변환되기 때문입니다. 따라서 플로트 값을 입력 할 때 코드에서 오류 메시지가 인쇄되지 않습니다. 하지만 후속 계산에는 영향을 미치지 않습니다.

다른 점은 입력이 숫자가 아니지만 문자 인 경우 입력 변수에 0이 할당된다는 것입니다.

입력 값을 확실하게 확인하려면 입력 변수 유형을 std:string으로 변경하고 문자열이 유효한 입력인지 확인해야합니다. 가능한 루틴 :

  1. 숫자가 없는지 확인하십시오.

  2. 프로그램 요구 사항에 따라 올바른 숫자인지 확인하십시오.

그래서 대신 거친 !l 수표를 작성, 또 다른 별도의 검사 기능을 작성하고 여기를 호출합니다.