2010-03-10 38 views
4

我通常使用指针通过以下方式如何使用十六进制表示法将值赋给char *?

 
    char *ptr = malloc(sizeof(char) * 100); 
    memset(ptr, 0, 100) ; 
    strncpy(ptr, "cat" , 100 - 1); 

但这一次,而不是使用“猫”,我想用它ASCII十六进制等价的。

猫= 0x63,0x61,0x74,0×00

我试图

 
    strncpy(ptr, "0x630x61" , 100 - 1); 

但预期它失败。

什么是正确的语法?

我是否需要放一个0x00?一会儿让我们忘记memset,现在我需要把一个0x00?因为在“猫”符号中,空值会自动放置。

问候

+0

什么是这个实际使用?这是中期利益和中期这可能会帮助驱动一个更好的答案... – Romain 2010-03-10 21:35:55

+0

这是有关一些UNICODE字符?你为什么想做这个? – dirkgently 2010-03-10 21:36:03

+0

@Romain这个问题一直在问(但很难搜索) - 我怀疑问题的深刻误解 – 2010-03-10 21:37:31

回答

10

\xXX为十六进制格式插入字符的语法。所以你会:

strncpy(ptr, "\x63\x61\x74", 100 - 1); 

你并不需要把在\x00因为具有自动报价空分隔字符串。

2
strncpy(ptr, "\x63\x61" , 100 - 1); 

0x63是一个整数十六进制文字; C编译器在代码中解析它。但是在一个字符串中,它被解释为一个字符序列0,x,6,3。 值为63(十六进制)的char的文字。是'\x63',并且在字符串内您必须使用此表示法。 "c\x63"是字符串零终止的字符串,无论引号内的字符(或表示它们的符号),所以不需要手动追加尾随零。

4

注意,你只需要在\“”串

char cat[4]; 
cat[0] = 0x63; 
cat[1] = 0x61; 
cat[2] = 0x74; 
car[3] = 0x00; 

char cat[] = "\x63\x61\x74"; // note the \0 is added for you 

char cat[] = { 0x63, 0x61, 0x74, 0x00 }; 

里面都是一样的

+2

我喜欢你展示三种选择的方式,但“\ 0x63 \ 0x61 \ 0x74”是错误的。它创建一个包含字符'0','x','6','3',0,...'的数组。当用作nul终止的字符串时,这是零长度。 – 2010-03-10 22:37:30

+0

抱歉 - 剪切并粘贴错误! – 2010-03-10 23:50:20

+2

尽管生成的可执行文件将具有相同的_behavior_,但这些都不是**,都是一样的:0x63是一个将被转换为“char”的“int”文字。有些编译器会为此发出“截断”警告。 'char x ['] = {'\ x63','\ x61','\ x74','\ x00'};'将和'char cat [] =“\ x63 \ x61 \ x74”并不会生成编译器警告。 – 2013-04-13 00:51:27

相关问题