C++ strtol的基础知识?

C++ strtol的基础知识?,c++,string,int,strtol,C++,String,Int,Strtol,我真的很困惑。我必须错过一些非常简单的东西,但我所读到的关于strtol()的任何内容都没有意义。有没有人能用一种非常基本的方式给我解释一下,并举例说明我是如何让下面这样的东西起作用的 string input = getUserInput; int numberinput = strtol(input,?,?); 引自: 将字符串转换为长整数 解析C字符串str,将其内容解释为指定基的整数,该整数作为长int值返回。如果endptr不是空指针,该函数还将endptr的值设置为指向数字后的第一

我真的很困惑。我必须错过一些非常简单的东西,但我所读到的关于strtol()的任何内容都没有意义。有没有人能用一种非常基本的方式给我解释一下,并举例说明我是如何让下面这样的东西起作用的

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

将字符串转换为长整数

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

所以试试类似的方法

long l = strtol(pointerToStartOfString, NULL, 0)

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

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

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

第三个参数是要转换的基数(base)。可以执行从二进制(基数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,请改用:

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

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

假设给您一个字符串
char const*str
。现在按如下方式转换:

#include <cstdlib>
#include <cerrno>

char * e;
errno = 0;

long n = std::strtol(str, &e, 0);
也可以使用
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 */ }
#包括
试试{long n=std::stol(str);}
catch(std::无效的参数const&e){/*error*/}
捕获(标准::超出范围常数和e){/*错误*/}

您是否尝试过使用
strtol
而不是
stringstream
来读取数字?您是否尝试过
int number=strtol(输入。**c_str()**,…) STD::Stol < /代码>时,代码不需要一个连线流。尝试使用Strl(输入,0,0)给了我一个错误:“不能转换<代码> STD::字符串> < /COD> const char *”,用于参数>代码> 1”到“/COD>长int STROTL(const char *,char **,int)”“是的,C++有代码> STD::String < /Cord> >,它不是<代码> char */COD>。即使它们用于同一事物(保留字符串),在一个上工作的函数在另一个上也不工作。对于std::string use
strtol(str.c_str(),0,0)
True关于
0
导致自动检测基。用“0109”的结果是“代码>8</CODE”,因为8是自动检测的基础。我是C++的新手,所以我不知道指针,尽管我知道这个概念。如何为我的字符串找到指针statorofString,以及它应该是什么样子它在C中如何工作是这样的:
char
是一个包含字符的变量
char*
是一个包含指针的变量。取消引用时,指针指向一个字符(通常是内存中许多字符的开头,称为“字符串”)。因此,如果您有
char*MyPointer
,那么您可以执行
strtol(MyPointer,NULL,0)
。好了,这样我的代码就可以正常工作了。只是检查传递一个没有数字的字符串会产生什么结果?字符串和C字符串之间的区别是什么?如果字符串中没有数字,
strtol
返回0。因为这是合法的返回值,所以必须使用中间参数来消除歧义。@ JAMESTHOMPSON:<代码>字符串(<代码> STD::String )是表示字符串的C++对象。它是处理C++中字符串的首选方法。C字符串是以空终止符(
\0
)结尾的字符序列,由指向序列中第一个字符(A
char*
)的指针表示。C函数(比如strtol)不接受字符串对象,所以你必须传递一个C字符串。我需要能够捕捉未输入的数字,但是对于我的项目,0是一个有效的数字,因此我不能只执行if(int=0)
strtol
保存指向
t
中第一个非数字字符的指针。如果
s==t
,则表示字符串中的第一个字符是非数字字符,即字符串不以数字开头。
if (*e != '\0') { /* error, die */ }
if (errno != 0) { /* error, die */ }
#include <string>

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