2012-06-28 175 views
0

我需要做的是以下内容。用户输入十六进制到十六进制阵列

const char *arrayHex[4]; 
for(int i = 0; i < 5; i++) 
{  
cin << uHex; 
arrayHex[i] = uHex; 
} 

但我需要arrayHex的成员是十六进制与\ x转义。我该怎么做呢?

这是真的措辞含糊,编辑以固定(希望)

如果输入为41,我想在打印时为“A”的结果,因为如果该值是“\ X41”

+3

你的循环错了!你的数组只有4个元素,但你循环从i = 0到4,这是5 –

+0

...和'arrayHex'是一个char指针数组。 'uHex'也是一个指针,或者你的意思是创建一个字符数组?如果后者,'const'应该被省略,因为你正在分配给该数组。 – eran

+0

@Michael发布一个示例输入和输出? – anatolyg

回答

0
#include <iostream> 
#include <string> 
#include <cstdlib> // for strtol() 
#include <cstdio> // for printf() 
#define countof(array) (sizeof(array)/sizeof(array[0])) 

int main() 
{ 
    std::string uHex; 
    long arrayValues[4]; 
    for(int i = 0; i < countof(arrayValues); ++i) 
    { 
     std::cin >> uHex; 
     char* end; 
     arrayValues[i] = std::strtol(uHex.c_str(), &end, 16); 
     // At this point, we expect end to be pointing at the '\0' 
     // (the C-string nul terminator). If it's not, then we have 
     // invalid chars in our input, and arrayValues[i] is bogus. 
     if (*end != '\0') 
     { 
      std::cout << "Invalid characters: \"" << uHex << "\" (please try again)\n"; 
      --i; // compensate for the ++i above to re-try this again 
     } 
    } 

    for(int i = 0; i < countof(arrayValues); ++i) 
    { 
     std::cout << i << " --> " << arrayValues[i] << " --> " 
        << static_cast<char>(arrayValues[i]) << '\n'; 
//  std::printf("%d --> %d --> %c\n", i, arrayValues[i], arrayValues[i]); 
    } 
} 

请注意,我正在以两种方式打印完全相同的输出:使用cout或使用printf()。我个人喜欢printf(),不是因为这是我第一次学到的东西,但是因为printf()格式化输出比cout更不详细(对于MOST内置类型),尽管cout更灵活,因为您可以创建cout输出函数用于用户定义的类型。但是如果你的编译器没有执行printf()/ scanf()格式参数类型检查(GCC确实如果启用它),那么你可以很容易地创建一些令人感兴趣的混淆输出和不匹配类型,并创建很好的非确定性通过指定少于您的格式字符串指示的参数,SEGV生成器很容易。

+0

不完全是我所需要的,我需要它被十六进制转义。例如,用户输入41,当我打印41保存到它的值时,打印出“A” – Michael

+0

@Michael - 好吧,我改变了它以做我认为你现在要做的事。如果你没有意识到这一点,一个数字可以(并且实际上应该在大多数情况下)以纯数字(二进制​​)形式存储在计算机中,例如'int','long','unsigned int'等。作为std :: string或char []数组(直接或通过char *)存储的数字并不是真正的数字,就CPU而言。 CPU不能直接加/减/乘/除等存储为字符数字的数字。在其纯数字(二进制​​)形式中,数字不是“十进制”或“十六进制”,它只是纯数字。 – phonetagger

+0

...数值只能以“十进制”或“十六进制”形式表示(即打印)。如果以“decimal”或“hex”形式(即在std :: string或char []/char *)中存储数字,则不会将其存储为CPU理解为数。然而,由于特定领域的原因,包括高精度科学/工程计算,数据库等,有时会使用其他存储格式(包括std :: string/char []/char *)。 – phonetagger