2012-04-18 42 views
2

這裏是一個更短的版本我的代碼:未成功使用sscanf的十六進制值讀取

char token[256]; 
unsigned int maskval = 0; 

//Token gets read in here. 

printf("token: %s\n", token); 

if (sscanf(token + 2, "%x", &maskval) == 1) { 
    //do stuff 
} else { 
    printf("error: %d, %x\n", maskval, maskval); 
} 

正如你可以看到我傳遞十六進制字符串的函數,閱讀他們進入令牌和使用的sscanf( )將字符串版本的十六進制值轉換爲無符號整數。字符串標記始終以「0x」,「0X」,「Ox」或「OX」開頭。原因是因爲當輸入值時用戶將無法區分0或O之間的差異(vi顯示它們相同,圖形)。結果我得到,如果我通過它「0x00EE」是:

token: 0x00EE 
error: 0 

我相信這個問題是我是否通過它的東西一起「0x00EE」或「OxOOEE」(零的與資本O公司)的線路。在vi中兩者看起來都是一樣的,我不確定在這種情況下它們的處理方式是否有所不同。希望我只是在做一些非常簡單而愚蠢的事情,但我忽略了它(通常是這樣)。另外,我還使用

maskval = strtol(token, NULL, 16); 

代替的sscanf()嘗試,但我得到同樣的結果。

任何想法?

+0

在我的VIM,'0'中有一個點,而'O'不! – Shahbaz 2012-04-18 14:01:49

+0

不應該是'char token [256];'??? – dasblinkenlight 2012-04-18 14:01:54

+0

另外,'%x'也可以讀取'0x'部分,所以你不需要寫'token + 2'好的答案! – Shahbaz 2012-04-18 14:02:21

回答

4

這裏有一個錯誤:

char *token[256]; 

這是一個256個指針的字符(char *)的陣列,而不是字符數組。

您的意思是:

char token[256]; 

應該有大量從這個編譯器警告。

試圖從一個字符串開始解析一個十六進制值不是一個有效的十六進制數字當然會失敗,對於sscanf()strtoul()。你幾乎聽起來好像你認爲標準函數應該認爲'O'是hex,因爲它看起來像你的數字0。那是......不是他們如何設計的,我認爲這是幸運的。 :)你可能想看看改變你的字體。

您可以手動清除不符合的前綴。假設你總是有2個字符的前綴,然後威力有一個,你可以這樣做:

const char *number = token + 2; 

while(!isxdigit(*number)) 
    number++; 
/* Now number will point at the first hexadecimal 
    digit in token, or '\0' if none were found. 
*/ 
if(sscanf(number, "%x", &maskval) == 1) 
    printf("success, got %x\n", maskval); 
else 
    printf("failed to parse '%s' as hexadecimal number\n", number); 
+0

必須在解決方案中解決一些問題,但它現在可行!必須改變while(isxdigit(* number))while(!isxdigit(* number))和if(sscanf)語句來評估sscanf爲1。 – halexh 2012-04-18 15:09:30