2017-10-24 1 views
1

나는 C++을 처음 접했고 아마도 분명히 뭔가 빠져있을 것이다. OCT와 HEX 번호를 DEC에 회신하고 싶습니다. 모든 종류의 잘못된 입력을 얻을 수 있으므로 많은 조건 대신 std :: stoul을 사용하여 변환을 수행하고 실패 할 때 catch하려고했습니다.Std :: stoul이 C++에서 실패한 후에 막히지 않는다.

방법의 요점은 문자열에서 3 개의 숫자를 얻는 것입니다. 첫 번째는 OCT, 두 번째는 DEC, 세 번째는 HEX입니다. 그들이 동일한 가치인지 아닌지를 확인해야합니다.

문자열의 벡터 vec에서 숫자를 얻지 만 정상적으로 작동하며 문제가 있다고 생각하지 않습니다.

메서드가 실패 할 때마다 (예 : OCT의 경우 "88") 전체 테스트가 실패하고 catch 블록으로 이동하지 못하는 문제가 있습니다.

bool validate_line(const std::string& str) { 
    std::vector<std::string> vec; 
    std::string tmp; 

    for (int i = 0; i < str.size(); i++){ 
     if(str.at(i) == ' '){ 
      vec.push_back(tmp); 
      tmp = ""; 
     } 
     else { 
      tmp += str.at(i); 
      if(i + 1 == str.size()) vec.push_back(tmp); 
     } 
    } 
    if(vec.size() != 3) return false; 

    //1 - Octan number 
    unsigned long octDec; 
    try { 
     octDec = std::stoul(vec.at(1), nullptr, 8); 
    } 
    catch(const std::invalid_argument& ia){ 
     return false; 
    } 

    //2 - Decimal 
    int dec = atoi(vec.at(2).c_str()); 

    //3 - Hex number 
    std::string h = vec.at(3).c_str(); 
    unsigned long hexDec; 
    try{ 
    hexDec = std::stoul(h, nullptr, 16); 
    } 
    catch(const std::invalid_argument& ia) { 
     return false; 
    } 

    if(octDec == dec && dec == hexDec) return true; 
    return false; 
} 

이이 방법에 대한 내 시험의 예는 다음과 같습니다

내 코드입니다. 첫번째 것은 ok 다. 나머지는 catch 블록으로 끝나야합니다.

TEST_CASE("Line validation", "[small1]") { 

    GIVEN("complex improperly tagged equal string") { 
     CHECK(validate_line("0111 73 0x49")); 
    } 

    GIVEN("string not conforming to format -- bad number format") { 
     CHECK(!validate_line("88 88 0x58")); 
    } 

    GIVEN("string not conforming to format -- not numbers") { 
     CHECK(!validate_line("07 7 G")); 
    } 
} 
+1

대부분의 경우 오류는 예상치 못한 코드에 있습니다. 아무튼 [mcve]를 제공해야합니다. 어떤 증오도 던지거나 걸리지 않는다는 것을 어떻게 알 수 있습니까? – user463035818

+0

시험 방법이 있습니다. 그래서 잘못된 입력을 가진 테스트가 올 때마다, catch 블록으로 들어가는 대신에 std : stoul을 가진 라인에서 실패합니다. –

+0

내가 쓴 것처럼, 예를 들어 OCT에 대해서 나는 옥탄 번호가 아닌 "88"을 보낸다. 그런 다음 실패해야하며 실제로 수행하지만 예외가 발생하지는 않습니다. 또는 16 진수의 경우 "2x"와 같은 형식으로 보낼 수 있습니다. 그런 종류의 물건들은 제가 제거하려고하는 것입니다. –

답변

2

코드는 항상 다음 줄에 반환

if(vec.size() != 4) return false; 

그렇게 던질 수있는 함수가 호출되지 않습니다.

그 시점의 vec.size()은 모든 테스트 입력에 대해 항상 3입니다.

UPDATE :이 답변이 이미 게시 된 후

영업 이익은

if(vec.size() != 3) return false; 

에 해당 코드의 라인을 변경했습니다.

+0

죄송합니다, 이것은 내가 보여준 코드의 잘못된 유형이었습니다.진짜 문제는 아닙니다. 원래 게시물에서 수정했습니다. –

+0

(원래 질문에 대한) 유효한 답변이 이미 있거나, 질문에 변경 사항이 있음을 확인한 후 질문을 변경하지 마십시오. * UPDATE : * section – cwschmidt

0

문제는 실제로 컴파일러에서 발생했습니다. CLion을 사용하고 디버깅 할 때 return 문만 있으면 catch 블록에 단계가 표시되지 않습니다. 코드에는 아무런 문제가 없습니다.

+0

Tomáš Zajda 그래서 원한다면 내 대답을 받아 들일 수 있습니다. – cwschmidt

관련 문제