strtol的基础知识?

时间:2013-02-10 02:30:15

标签: c++ string int strtol

我真的很困惑。我必须遗漏一些相当简单的东西,但我读到的关于strtol()的任何内容都没有意义。有人能以一种非常基本的方式为我拼出它,并举例说明我可能会得到类似以下的东西吗?

string input = getUserInput;
int numberinput = strtol(input,?,?);

4 个答案:

答案 0 :(得分:31)

第一个参数是字符串。它必须作为C字符串传递,因此如果您std::string首先使用.c_str()

第二个参数是可选的,并指定char *以在数字结尾后存储指向字符的指针。这在转换包含多个整数的字符串时很有用,但如果您不需要它,只需将此参数设置为NULL。

第三个参数是要转换的基数(基数)。 strtol可以执行从二进制(基数2)到基数36的任何操作。如果您希望strtol根据前缀自动选择基数,请传入0。

因此,最简单的用法是

long l = strtol(input.c_str(), NULL, 0);

如果你知道你得到十进制数字:

long l = strtol(input.c_str(), NULL, 10);
如果字符串开头没有可转换字符,则

strtol返回0。如果要检查strtol是否成功,请使用中间参数:

const char *s = input.c_str();
char *t;
long l = strtol(s, &t, 10);
if(s == t) {
    /* strtol failed */
}

如果您使用的是C ++ 11,请改用stol

long l = stol(input);

或者,您可以使用stringstream,其优点是可以像cin一样轻松阅读多个项目:

stringstream ss(input);
long l;
ss >> l;

答案 1 :(得分:3)

假设您有一个字符串char const * str。现在将其转换为:

#include <cstdlib>
#include <cerrno>

char * e;
errno = 0;

long n = std::strtol(str, &e, 0);

最后一个参数0确定您要应用的数字基数; 0表示“自动检测”。其他合理的值包括81016

接下来,您需要检查结束指针e。这指向消耗输入后的字符。因此,如果消耗了所有输入,则它指向空终止符。

if (*e != '\0') { /* error, die */ }

也可以使用e允许部分输入消耗,但这是您在实际需要时可以理解的那种东西。

最后,您应该检查错误,如果输入不适合目标类型,则基本上只会出现溢出错误:

if (errno != 0) { /* error, die */ }

在C ++中,最好使用std::stol,但在这种情况下你不能选择数字基数:

#include <string>

try { long n = std::stol(str); }
catch (std::invalid_argument const & e) { /* error */ }
catch (std::out_of_range const & e)     { /* error */ }

答案 2 :(得分:0)

引自C++ reference

long int strtol ( const char * str, char ** endptr, int base );

将字符串转换为长整数

解析C字符串str将其内容解释为指定基数的整数,并以long int值的形式返回。如果endptr不是空指针,该函数还会将endptr的值设置为指向数字后面的第一个字符。

所以尝试像

这样的东西
long l = strtol(pointerToStartOfString, NULL, 0)

答案 3 :(得分:0)

我总是简单地使用strol(str,0,0) - 它返回长值。 0表示radix(最后一个参数)表示从输入字符串中自动检测它,因此输入字符串中可以使用十进制0x10和十进制10