如何使用十六进制表示法为char*赋值?

And*_*sne 9 c

我通常以下列方式使用指针

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

但是这一次,而不是使用"cat",我想在十六进制中使用ASCII等效.

cat = 0x63,0x61,0x74,0x00

我试过了

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

但它按预期失败了.

什么是正确的语法?

我还需要放一个0x00吗?让我们忘记一下memset,现在我需要放一个0x00吗?因为在"cat"表示法中,会自动放置null.

问候

Cla*_*diu 16

\xXX是以十六进制格式插入字符的语法.所以你的是:

strncpy( ptr, "\x63\x61\x74", 100 - 1);
Run Code Online (Sandbox Code Playgroud)

您不需要输入,\x00因为引号自动为null分隔字符串.


Mar*_*ett 6

请注意,您只需要在 " " 字符串中使用 \

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 };
Run Code Online (Sandbox Code Playgroud)

都一样

  • 尽管生成的可执行文件将具有相同的 _behavior_ 这些 ** 不** 完全相同:0x63 是一个 `int` 文字,将被转换为 `char`。一些编译器会为此发出“截断”警告。`char cat[] = { '\x63', '\x61', '\x74', '\x00' };` 将与 `char cat[] = "\x63\x61\x74";`并且不生成编译器警告。 (5认同)
  • 我喜欢你展示三个选项的方式,但 "\0x63\0x61\0x74" 是错误的。它创建了一个包含字符‘0, 'x', '6', '3', 0, ...` 的数组。当用作以空字符结尾的字符串时,它的长度为零。 (3认同)
  • 谨防 !``cat[0] = 0xAA`` 会使您在从 'int' 到 'char' 的转换中溢出,并且 ``cat[] = { 0xAA }`` 根本行不通,您将收到缩小错误转换。因此你应该删除“都一样”它不是。检查:http://coliru.stacked-crooked.com/a/1809f688901d0434 (2认同)