我知道以下2个初始值设定项是等效的:
char T1[]="abc";
char T2[]={'a', 'b', 'c', 0};
我有一个像这样的数组初始值设定项:
char T[]={0x10, 0xF, 0xF0, 'H', 'e', 'l', 'l', 'o', 0xC1, 0xD0};
不考虑签名/未签名的char潜在问题,有没有办法混合2种样式的初始化程序,做类似的事情(它不起作用):
char T[]={0x10, 0xF, 0xF0, "Hello", 0xC1, 0xD0};
答案 0 :(得分:4)
你不能那样混合它们。您可以做的是插入带字符串的十六进制代码,例如:
char T[] = "\x10\x0f\xf0" "Hello" "\xc1\xd0";
请注意,这会在该数组的末尾添加\0
,因此如果您使用sizeof
来获取字节数,则可能需要进行调整:
size_t bytesInT = sizeof(T) - 1;
同样,在<{1}}的末尾不会为空,但您可以通过以下方式解决此问题:
Hello
您可能想知道为什么字符串被分成三个组件。这是有效的,因为编译过程的早期阶段涉及连接相邻字符串,这意味着char T[] = "\x10\x0f\xf0" "Hello\0" "\xc1\xd0";
和"paxdiablo"
在功能上是等效的。
一个原因是可读性,但重要的是确保十六进制规范不会“吞下”以下字符。对"pax" "diablo"
无关紧要,因为Hello
不是有效的十六进制字符,但您可以在此处看到问题:
H
这将输出#include <stdio.h>
int main(void) {
printf ("%d %d\n", sizeof("\x20Hi"), sizeof("\x20Bi"));
return 0;
}
,尽管两个字符串中的唯一差异(看似)是一个字符的变化。长度不同,因为4 3
中的B
实际上被用作十六进制数字,被视为Bi
(尽管\x20B
,但是,{1}}将警告您结果价值超出范围。)
答案 1 :(得分:2)
您不能混合使用这两种样式,但可以在带有HEX escape sequences的以空字符结尾的字符串中包含HEX字符:
// Instead of this
char T1[] = {0x10, 0xF, 0xF0, 'H', 'e', 'l', 'l', 'o', 0xC1, 0xD0};
// Do this:
char T2[] = "\x10\x0F\xF0" "Hello" "\xC1\xD0";
// or even this:
char T3[] = "\x10" "\x0F" "\xF0" "Hello" "\xC1" "\xD0";
上面和初始化程序之间的唯一区别是T2
和T3
将在末尾有一个带有空终止符的额外字节。
上面的语法利用了C的特性,它自动连接由空格分隔的多个字符串文字。