2017-04-03 22 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 
相关问题