8

我真的很困惑。我必须遗漏一些相当简单的东西,但我所读到的关于 strtol() 的内容没有任何意义。有人可以以非常基本的方式为我拼写出来,并举例说明我如何使以下内容起作用吗?

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

4 回答 4

33

第一个参数是字符串。它必须作为 C 字符串传入,所以如果你有std::string使用的话.c_str()

第二个参数是可选的,它指定 achar *来存储指向数字末尾字符的指针。这在转换包含多个整数的字符串时很有用,但如果您不需要它,只需将此参数设置为 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);

或者,您可以只使用 a stringstream,它的优点是能够轻松阅读许多项目,例如cin

stringstream ss(input);
long l;
ss >> l;
于 2013-02-10T02:41:16.020 回答
4

假设给你一个字符串char const * str。现在像这样转换它:

#include <cstdlib>
#include <cerrno>

char * e;
errno = 0;

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

最后一个参数0确定您要应用的数字基数;0意思是“自动检测”。其他合理的值是8,1016

接下来您需要检查结束指针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 */ }
于 2013-02-10T02:41:40.627 回答
0

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

于 2013-02-10T02:38:41.807 回答
0

引用C++ 参考

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

将字符串转换为长整数

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

所以尝试类似的东西

long l = strtol(pointerToStartOfString, NULL, 0)
于 2013-02-10T02:34:28.030 回答