2017-04-03 23 views
0

當試圖將「24」的八進制值讀入unsigned int時,我得到0.只是將十進制值作爲字符數組傳遞。使用C++或C++在八進制數中使用sscanf讀取字符數組時的問題

我需要最終值作爲32位無符號整型。初始值是從二進制文件讀入的。

MCVE

simple.cpp

#include <iostream> 
#include <cstdlib> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char count[4] = "\030\000\000"; // Just "24" works 
    __uint32_t value; 
    sscanf(count, "%x", &value); 
    fprintf(stderr, "%x", value); 
    return 0; 
} 

編譯和執行使用

$ g++ simple.cpp -g 
$ ./a.out 
0 
$ g++ --version 
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 
+0

你真正需要的是檢查從系統功能的返回值,就像'的sscanf()',如果貼的代碼已經檢查返回值,很明顯,調用'sscanf()'失敗。代碼中的任何其他問題都是次要的 – user3629249

回答

4

八進制值030是表示特殊的 「CAN」 一個單個字符(取消)控制字符ASCII encoding(這是Englis最常用的編碼h字母和數字以及標點符號)。

當您使用scanf (or its sibling sscanf)它會嘗試讀取數字,這在ASCII編碼是值060071(用於數字09,包括在內)。

爲了能夠使用sscanf來讀取數字24您需要兩個字符'2''4'。即"24"(或"\062\064")。


如果你想單個字符'\030'轉換爲整數值24,然後就去做例如

value = count[0]; 
+0

一些progammer老兄,是否有辦法強制scanf不用ASCII編碼查找數字?我無法改變輸入的方式。 – kshikama

+0

value = count [0];給出18.也可能是輸入比一個字節長。 編輯:它打印時作爲十進制24。 Nvm在那裏。 – kshikama

+1

@kshikama否,'scanf'(及其兄弟)讀取文本編碼的字符串。 –

2

我假定你從二進制文件來創紀錄的拿到4個字節,並且要將這些4個字節轉換爲uint32_t值。我還假定這些字節具有預期的字節順序。

最簡單的(和最標準的符合性的方式)來進行轉換是字節表示複製到一個變量:

#include <iostream> 
#include <cstdlib> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char count[4] = "\030\000\000"; // Just "24" works 
    __uint32_t value; 
    memcpy(&value, count, sizeof(value)); 
    fprintf(stderr, "%d", value); 
    return 0; 
} 

將返回預期24

+0

啊,是的!提交了一些小的改變,但這確實有效。 – kshikama

0

這裏是你的代碼的一個版本,該檢查在電話會議上的錯誤scanf()

注意:不需要的C++頭文件被註釋掉。

//#include <iostream> 
//#include <cstdlib> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

int main(void) 
{ 
    char count[4] = "\030\000\000"; // Just "24" works 
    uint32_t value; 
    if(1 != sscanf(count, "%x", &value)) 
    { 
     fprintf(stderr, "sscanf failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, sscanf successful 

    printf("%x", value); 
    return 0; 
} 

,這裏是輸出結果:

sscanf failed 
相關問題