你如何获得一个unsigned long一个字符串的?(How do you get an unsi

2019-08-16 22:23发布

什么是检索在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和抛出异常?

我的道歉,如果这是一种欺骗,但我无法找到完全匹配矿的任何问题。

Answer 1:

一种方式做到这一点:

stringstream(str) >> ulongVariable;


Answer 2:

您可以使用strtoul将没有问题。 该函数返回一个unsigned long。 如果皈依无法执行函数返回0。如果正确的长值超出函数返回ULONG_MAX和errno全局变量设置为ERANGE范围。



Answer 3:

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);


Answer 4:

如果您可以使用Boost库(www.boost.org)看看转换库 - 这是一个仅有头包括:

#include "boost/lexical_cast.hpp"

那么所有你需要做的是

unsigned long ul = boost::lexical_cast<unsigned long>(str);


Answer 5:

杰弗里Stedfast有一个美丽的后关于写作INT解析器例程单(C语言)。
它会生成一个使用代码使用原生类型(您需要32位解析32位)和错误代码溢出。



Answer 6:

使用“蒂”内置STD功能

例如的std :: string输入= “1024”;

的std ::蒂(input.c_str());

蒂期望参数的类型为C字符串的,所以c_str(),难道是给你的。



Answer 7:

可靠的方法将是写一个静态函数,并用它

bool str2Ulong(const string& str,unsigned long & arValue)
{
   char *tempptr=NULL;
   arValue=strtoul(str,tempptr,10);

   return ! (arValue==0 && tempptr==str.c_str());

}


文章来源: How do you get an unsigned long out of a string?