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

时间:2013-10-09 12:29:27

标签: c++ type-conversion unsigned

我使用以下代码将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;
}

3 个答案:

答案 0 :(得分:3)

使用base-10:

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

或允许自动检测基础:

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

strtoul的第三个参数是要使用的基础,你将它作为基础-1。

答案 1 :(得分:2)

您需要使用:

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

您使用base=1表示只允许使用零。

如果您需要有关整数基数的信息,请阅读this

答案 2 :(得分:1)

C标准库函数strtoul将数字系统的base/radix作为其第三个参数,用于解释第一个参数指向的char数组。

  

我在哪里做错了?

     

NC = strtoul将(N,&安培; PEND,<强> 1 );

您将基数传递为1,这会导致unary numeral system,即唯一可以重复的数字是0.因此,您只能将其作为输出。如果需要十进制系统解释,则传递10而不是1。

或者,传递0允许函数根据前缀自动检测系统:如果它以 0 开头,那么它被解释为八进制,如果它是 0x 0X 它被视为十六进制,如果它有其他数字则假定为十进制。

<强>除了:

  • 如果您不需要知道转换被考虑的字符,则不需要传递虚拟的第二个参数;你可以改为NULL
  • 当您在C ++程序中使用C标准库函数时,it's recommended包含C ++版本的标头;使用前缀c,不带后缀.h,例如在您的情况下,它是#include <cstdlib>
  • using namespace std;considered bad practice