什么是检索在C ++字符串一个unsigned long最安全,最好的方法是什么?
我知道许多可能的方法。
首先,将符号长从蒂拍摄。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
与此明显的问题是,当存储在myStr中的值大于符号长可以包含更大,会发生什么? 是什么蒂找回?
接下来可能是使用strtoul将。
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
然而,这是一个有点过于复杂了我的需求。 我想一个简单的函数,字符串,无符号长基地 - 10。 此外,错误处理极不理想。
我发现最后一种可能性是使用sscanf的。
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
同样,错误处理留下不理想,有点复杂得多,我想。
其余的明显的选择是写以前的可能性,或者一些东西,其循环通过串并,直到它到达ULONG_MAX每个数字转换手动围绕一个我自己无论是包装。
我的问题是,什么是我的谷歌福未能找到其他的选择? 在C ++的std库的任何事情,这将字符串转换干净就失败一个unsigned long和抛出异常?
我的道歉,如果这是一种欺骗,但我无法找到完全匹配矿的任何问题。
一种方式做到这一点:
stringstream(str) >> ulongVariable;
您可以使用strtoul将没有问题。 该函数返回一个unsigned long。 如果皈依无法执行函数返回0。如果正确的长值超出函数返回ULONG_MAX和errno全局变量设置为ERANGE范围。
template <class T>
T strToNum(const std::string &inputString,
std::ios_base &(*f)(std::ios_base&) = std::dec)
{
T t;
std::istringstream stringStream(inputString);
if ((stringStream >> f >> t).fail())
{
throw runtime_error("Invalid conversion");
}
return t;
}
// Example usage
unsigned long ulongValue = strToNum<unsigned long>(strValue);
int intValue = strToNum<int>(strValue);
int intValueFromHex = strToNum<int>(strHexValue,std::hex);
unsigned long ulOctValue = strToNum<unsigned long>(strOctVal, std::oct);
如果您可以使用Boost库(www.boost.org)看看转换库 - 这是一个仅有头包括:
#include "boost/lexical_cast.hpp"
那么所有你需要做的是
unsigned long ul = boost::lexical_cast<unsigned long>(str);
杰弗里Stedfast有一个美丽的后关于写作INT解析器例程单(C语言)。
它会生成一个使用代码使用原生类型(您需要32位解析32位)和错误代码溢出。
使用“蒂”内置STD功能
例如的std :: string输入= “1024”;
的std ::蒂(input.c_str());
蒂期望参数的类型为C字符串的,所以c_str(),难道是给你的。
可靠的方法将是写一个静态函数,并用它
bool str2Ulong(const string& str,unsigned long & arValue)
{
char *tempptr=NULL;
arValue=strtoul(str,tempptr,10);
return ! (arValue==0 && tempptr==str.c_str());
}