2013-10-09 228 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
相關問題