2013-03-01 282 views
5

我目前正在設計一個代碼,並且給出的指令之一是獲取十六進制字符串的前兩位數字並執行所需的操作。所有小於A的都被考慮在內。任何比這更大的東西都不是,它只需要下一個數字。這弄亂了代碼。將十六進制字符串轉換爲unsigned int問題C++

這裏是一個將其轉換線:

int x = atoi(hex.c_str); 

我在做什麼錯?

+2

您使用的atoi。 (閱讀規格。) – 2013-03-01 00:46:37

+1

(試試strtol與基地16) – 2013-03-01 00:48:44

+0

好的,是否有另一條指令,我們可以用來將十六進制字符串轉換爲無符號整型? – 2013-03-01 00:48:50

回答

14

我假設這是你的意思 - 你只想將字符串的前兩個十六進制數字轉換爲無符號整數。我還假定該字符串只包含有效的十六進制數字。如果你想驗證字符串,你需要爲它寫一些額外的代碼。

使用strtoul改爲將十六進制字符串轉換爲無符號整數。還可以使用字符串類的substr()方法僅提取十六進制字符串的前2位數字。

#include <string> 
#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    std::string myhex = "abcdef"; 
    unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16); 
    printf("x = %d\n", x); 
} 

這將是你的輸出(即0xab = 171):

x = 171 
1
int x = strtol(hex.c_str(), NULL, 16); 

如果您想要讀取部分字符串,也可以使用sscanf。你提到過你可能只想要前兩個字符:

int x; 
if(1 == sscanf(hex.c_str(), "%2x", &x)) { 
    printf("Value is: %d\n", x); 
} else { 
    printf("Conversion failed\n"); 
} 

注意上面不是真的C++。您可以使用std::hex流修改爲(注意,我叫你的字符串mystr這段時間,以避免混淆(特別是如果你已經導入了命名空間std):

int x; 
std::istringstream iss(mystr); 
bool ok = (iss >> std::hex >> x); 

[編輯]我注意到您的評論你問轉換爲無符號整數,在這種情況下,爲什麼你沒有明確聲明你的整數作爲unsigned int

對於未簽名的,你應該使用strtoul

1

atoi功能需要基數10

改爲使用例如strtol

通常是一個好主意閱讀文檔。只需將該函數的名稱寫入AltaVista(或者就此而言,谷歌)。它會爲你找到一些文件

+0

哇!我不知道Altavista仍然存在! – 2013-03-01 01:29:59

+0

雖然2013年7月8日停止存在。它只是重定向到Yahoo! – nikoliazekter 2017-01-20 18:05:48

0

如果你要轉換爲無符號的,你可能想要使用strtoul - 前綴爲0x或給予16的基數。有可能strtol也可以正常工作,但這應該會給出一個有符號的值,所以至少你可能會得到一些警告信息,讓你從某些編譯器中混合簽名和未簽名。

相關問題