先上代码
static bool string_to_int(const std::string& str, int& num) {
int origin_num = num;
std::stringstream ss;
ss << str;
ss >> num;
if (ss.eof() && !ss.fail()) {
return true;
} else {
num = origin_num;
return false;
}
}
- 注意,要判断是否转换成功,最好用状态位判断,参考primer 8.1.2节。总结来看,bad表示不可恢复错误,fail表示可恢复错误,如期望读数值确读字符等,eof代表是否流结束。当这三个都为0时,good为1
- 所以判断是否转换成功,不要用good,要用fail,用流作为条件也等价于!fail(),像这种if (ss),等价于if (!ss.fail())
- 要注意的是,类似"12he"这种字符串,fail为0,因为前两个为数字,但是eof为0,流没有结束。所以如果可以接受这种,读前面的数字就够了,那用fail判断即可,如果这种不可接受,那就加上eof判断