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;
}
4

3 回答 3

4

使用 base-10:

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

或允许自动检测碱基:

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

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

于 2013-10-09T12:32:30.560 回答
2

你需要使用:

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

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

如果您需要有关整数基数的信息,您可以阅读此内容

于 2013-10-09T12:43:01.223 回答
1

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

我在哪里做错了?

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

您将基数作为 1 传递,这会导致一元数字系统,即唯一可以表示的数字是 0。因此,您只会得到它作为输出。如果您需要十进制系统解释,请传递 10 而不是 1。

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

在旁边:

  • 如果您不需要知道考虑转换的字符,则不需要传递虚拟的第二个参数;你可以通过NULL
  • 当您在 C++ 程序中使用 C 标准库函数时,建议您包含 C++ 版本的头文件;有前缀c,没有后缀,.h例如在你的情况下,它会是#include <cstdlib>
  • using namespace std;认为是不好的做法
于 2013-10-09T12:49:55.300 回答