나는 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"));
}
}
대부분의 경우 오류는 예상치 못한 코드에 있습니다. 아무튼 [mcve]를 제공해야합니다. 어떤 증오도 던지거나 걸리지 않는다는 것을 어떻게 알 수 있습니까? – user463035818
시험 방법이 있습니다. 그래서 잘못된 입력을 가진 테스트가 올 때마다, catch 블록으로 들어가는 대신에 std : stoul을 가진 라인에서 실패합니다. –
내가 쓴 것처럼, 예를 들어 OCT에 대해서 나는 옥탄 번호가 아닌 "88"을 보낸다. 그런 다음 실패해야하며 실제로 수행하지만 예외가 발생하지는 않습니다. 또는 16 진수의 경우 "2x"와 같은 형식으로 보낼 수 있습니다. 그런 종류의 물건들은 제가 제거하려고하는 것입니다. –