2013-10-09 83 views
1

我正在使用以下代码将Const char *转换为Unsigned long int,但输出始终为0。我在哪里做错了?请告诉我。将Const char *转换为Unsigned long int - strtoul

这里是我的代码:

#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; 
} 
+0

顺便说一句,如果有人想将其转换为一个'无符号长long',功能['标准:: stoull'(HTTP: //www.cplusplus。com/reference/string/stoull /),而'unsigned long'是['std :: stoul'](http://www.cplusplus.com/reference/string/stoul/)。 – Volomike

回答

1

您需要使用:

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

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

如果您需要了解整数基地简介您可以阅读this

+0

谢谢!为链接。所以这个基地通常是八进制/十进制/二进制/六进制等? – user2754070

+0

是的,在你的案例库(1)中也存在一些* exotic *碱基,我找不到那个词。 – ST3

+0

如果我想从Const char *转换为Unsigned long int *',该怎么办?你可以让我知道... – user2754070

3

使用基地10:

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

或允许该基站是自动检测:

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

的第三个参数strtoul是要使用的基础,并且您将其作为base-1。

+0

谢谢!但这个“基地”是什么?你能简单解释一下吗?我在这里看过'strtol'它不清楚。 – user2754070

+0

要使用基本参数作为零不是最好的想法,例如看看我的十进制数:10101010 – ST3

+0

@ user2754070:[请参阅此处](http://simple.wikipedia.org/wiki/Base_%28mathematics%29)。你应该从学校和“十进制”,“二进制”等术语回忆它。 –

1

C标准库函数strtoul作为它的第三个参数指定系统的base/radix在解释字符数组可以使用的第一个参数指向。

我在哪里做错了?

nc = strtoul(n,& pEnd,);

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

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

旁白:

  • 如果你不需要知道其高达转换被认为然后经过不需要一个虚拟的第二个参数的字符;您可以改为通过NULL
  • 当您在C++程序中使用C标准库函数时,包含C++版本的头文件的it's recommended;前缀为c,没有后缀.h,例如你的情况,这将会是#include <cstdlib>
  • using namespace std;considered bad practice