我是C ++的新手,可能会遗漏一些明显的东西。我想把OCT和十六进制数转换成DEC。我可以得到各种错误的输入,所以我想用std :: stoul进行转换而不是很多条件,并在失败时捕获。
该方法的要点是在字符串中获得3个数字。首先是OCT,第二个是DEC,第三个是HEX。我需要检查它们是否是相同的值。
我从字母表的矢量 vec 中获取数字,但这样运作正常,我不认为问题就在那里。
问题是,无论何时方法失败(例如" 88"对于OCT),整个测试都会失败并且不会进入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;
}
这些是我对此方法的测试示例。第一个是好的。其余的应该在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"));
}
}
答案 0 :(得分:2)
您的代码始终返回以下行:
if(vec.size() != 4) return false;
因此永远不会调用可抛出的函数。
此时vec.size()
对于所有测试输入始终为3。
<强>更新强>
OP将有问题的代码行改为
if(vec.size() != 3) return false;
此答案已经发布。
答案 1 :(得分:0)
问题确实存在于编译器中。我使用CLion并且在调试时如果只有return语句则不显示catch块的步骤。代码确实没有任何问题。