首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strtol的基础知识?

strtol的基础知识?
EN

Stack Overflow用户
提问于 2013-02-10 10:30:15
回答 4查看 31.1K关注 0票数 8

我真的很困惑。我不得不遗漏了一些非常简单的东西,但我读到的关于strtol()的内容没有任何意义。有没有人可以用一种非常基本的方式给我解释清楚,并举例说明我如何让下面这样的东西工作?

代码语言:javascript
运行
复制
string input = getUserInput;
int numberinput = strtol(input,?,?);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-10 10:41:16

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

第三个参数是要转换的基数(基数)。strtol可以做从二进制(基数2)到基数36的任何事情。如果希望strtol根据前缀自动拾取基数,则传入0。

因此,最简单的用法是

代码语言:javascript
运行
复制
long l = strtol(input.c_str(), NULL, 0);

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

代码语言:javascript
运行
复制
long l = strtol(input.c_str(), NULL, 10);

如果字符串开头没有可转换字符,则strtol返回0。如果您想检查strtol是否成功,请使用中间的参数:

代码语言:javascript
运行
复制
const char *s = input.c_str();
char *t;
long l = strtol(s, &t, 10);
if(s == t) {
    /* strtol failed */
}

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

代码语言:javascript
运行
复制
long l = stol(input);

或者,您也可以只使用stringstream,它的优点是可以像cin一样轻松地读取许多项

代码语言:javascript
运行
复制
stringstream ss(input);
long l;
ss >> l;
票数 33
EN

Stack Overflow用户

发布于 2013-02-10 10:41:41

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

代码语言:javascript
运行
复制
#include <cstdlib>
#include <cerrno>

char * e;
errno = 0;

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

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

接下来,您需要检查结束指针e。这指向所使用的输入之后的字符。因此,如果所有输入都被使用,它将指向空终止符。

代码语言:javascript
运行
复制
if (*e != '\0') { /* error, die */ }

也可以使用e来允许部分输入消费,但这是您真正需要时才会理解的东西。

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

代码语言:javascript
运行
复制
if (errno != 0) { /* error, die */ }

在C++中,使用std::stol可能更好,尽管在这种情况下您不能选择数字基数:

代码语言:javascript
运行
复制
#include <string>

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

Stack Overflow用户

发布于 2013-02-10 10:34:28

引用自C++ reference

代码语言:javascript
运行
复制
long int strtol ( const char * str, char ** endptr, int base );

将字符串转换为长整型

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

所以试试像这样的东西

代码语言:javascript
运行
复制
long l = strtol(pointerToStartOfString, NULL, 0)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14794079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档