将Const char *转换为Unsigned long int - strtoul

3
我将使用以下代码将 Const char * 转换为 Unsigned long int,但输出结果始终为 0。我做错了什么?请告诉我。

这是我的代码:

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() 
{
    vector<string> tok;
    tok.push_back("2");
    const char *n = tok[0].c_str();
    unsigned long int nc;
    char *pEnd;
    nc=strtoul(n,&pEnd,1);
    //cout<<n<<endl;
    cout<<nc<<endl; // it must output 2 !?
    return 0;
}

1
顺便说一下,如果有人想将它转换为“unsigned long long”,函数是std::stoull,而“unsigned long”则是std::stoul - Volomike
3个回答

4

使用十进制:

nc=strtoul(n,&pEnd,10);

或者允许自动检测基础:

nc=strtoul(n,&pEnd,0);
strtoul的第三个参数是要使用的进制,而您将其设置为base-1。

谢谢!但是这个“base”是什么?你能简要解释一下吗?我在这里读到了strtol,但不是很清楚。 - user2754070
将基本参数设为零并不是最好的想法,例如看看我的十进制数:10101010。 - ST3
@user2754070:看这里。你应该从学校里记得它,例如十进制二进制等术语。 - Jesse Good
耶!我从ST3的链接http://www.mathpath.org/concepts/Num/conv.htm得到了它。:) - user2754070
@ST3:10101010 有什么特别之处吗? - Jesse Good
1
@ST3:strtoul函数始终将其视为十进制,除非它以00x开头。 - Jesse Good

2

你需要使用:

nc=strtoul(n,&pEnd,10);

您使用了 base=1,这意味着只允许使用零。

如果您需要关于整数进制的信息,可以阅读此文


谢谢您提供的链接。所以这个基数通常是八进制/十进制/二进制/十六进制等,对吗? - user2754070
是的,在您的情况下存在一些“奇特”的基础,例如base(1),我找不到合适的词语来描述它。 - ST3
如果我想要将 Const char * 转换为 Unsigned long int *,你能告诉我吗? - user2754070
@user 转换后的结果存储在内存中,并且它的表示形式是变量,在这种情况下,变量被命名为 nc。如果你想要一个指针,你需要使用 &nc - ST3
@用户,这需要更改为:unsigned long int nc; nc=strtoul(n,&pEnd,10); cout<<&nc<<endl; - ST3
让我们在聊天中继续这个讨论 - user2754070

1
C标准库函数strtoul的第三个参数是要用于解释第一个参数所指向的字符数组的数字系统的基数/进制

我做错了什么?

nc=strtoul(n,&pEnd,1);

你将基数设为了1,这会导致使用一元数字系统,即唯一能够表示的数字是0。因此你将得到0作为输出结果。如果你需要十进制解释,应该将基数设为10而不是1。

另外,将基数设为0则会让函数根据前缀自动检测数字系统:如果以0开头,则被解释为八进制;如果以0x0X开头,则被解释为十六进制;如果包含其他数字,则被视为十进制。

附注:

  • 如果您不需要知道转换考虑到哪个字符,那么传递一个虚拟的第二个参数是不必要的;您可以传递NULL
  • 当您在C++程序中使用C标准库函数时,建议您包含头文件的C++版本;前缀为c,没有后缀.h,例如在您的情况下,应该是#include <cstdlib>
  • using namespace std;被认为是一种不好的实践

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接