您如何从字符串中获得未签名的长时间?
-
18-09-2019 - |
题
从C ++中的字符串中检索未签名的最安全和最佳方法是什么?
我知道许多可能的方法。
首先,转换了一个从Atol带走的签名。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
明显的问题是,当存储在mystr中的值大于签名长的长时间可以包含时会发生什么? Atol检索什么?
下一个可能性是使用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。
我的问题是,我的Google-Fu找不到的其他选择是什么? C ++ STD库中的任何东西都可以将字符串清洁转换为未签名的长时间并在故障上抛出例外吗?
如果这是骗子,我很抱歉,但是我找不到任何与我的完全匹配的问题。
解决方案
一种方法:
stringstream(str) >> ulongVariable;
其他提示
您可以毫无问题地使用Strtoul。该函数返回一个未签名的长度。如果无法执行转换,则函数返回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);
Jeffrey Stedfast有一个美丽的帖子 关于为单声道编写int解析器例程(在C中)。
它生成使用使用本机类型的代码(您需要32位来解析32位)和溢出的错误代码。
使用“ ATOL”内置的性病功能
例如,std :: string input =“ 1024”;
std :: atol(input.c_str());
ATOL期望参数为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());
}