我们是否有一种以严格的方式将char *转换为int(或long)的标准方法,即只有当所有字符都是数字并且可以适合int(或long)时,我们才能获得正确的结果 - 一些通过使用strtol等方式..?
因此,使用该功能,“sbc45”,“4590k”,“56”,“56”应全部无效。
答案 0 :(得分:3)
这是一个接近@GMan所做的版本,但它不接受prepeding空格。例如" 101"
:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <exception>
long strict_conversion(const std::string& number_string)
{
long number;
std::stringstream convertor;
convertor << std::noskipws << number_string;
convertor >> number;
if( convertor.fail() || !convertor.eof() )
throw std::runtime_error("The string didn't pass the strict conversion!");
return number;
}
一分钟后,这是通用的:
template <typename NumberType>
NumberType strict_conversion(const std::string& number_string)
{
NumberType number;
std::stringstream convertor;
convertor << std::noskipws << number_string;
convertor >> number;
if( convertor.fail() || !convertor.eof() )
throw std::runtime_error("The string didn't pass the strict conversion!");
return number;
}
答案 1 :(得分:2)
您可以使用strtol
- 它返回指向输入中第一个“错误字符”的指针,因此您只需检查'\0'
以查看是否有任何垃圾。如果值超出范围,则errno
设置为ERANGE
,因此您也可以检测到该值。
唯一需要注意的是strtol
会悄悄丢弃任何领先的空白。您可以通过将isspace
应用于输入的第一个字符来自行检查。
答案 2 :(得分:0)
我想我会用这样的东西:
long convert(std::string const &s) {
if (s.find_first_not_of("0123456789") != std::string::npos)
throw std::invalid_argument("Cannot convert value");
return strtol(s.c_str(), NULL, 10);
}