字符常量:\000 \xhh

13

请问有人可以解释一下字符常量中的 \000 和 \xhh 的使用方法吗?其中 \000 是八进制数,\xhh 是十六进制数。

3个回答

6
在C语言中,字符串以值为零(0)的字符终止。可以这样写:

在C语言中,字符串以值为零(0)的字符终止。

char zero = 0;

但是在字符串内部,这种方法不起作用。在字符串字面值中使用了一种特殊的语法,其中反斜杠作为转义序列引入,并跟随各种内容。

其中一种序列是“反斜杠零”,它表示一个值为零的字符。因此,您可以像这样编写:

char hard[] = "this\0has embedded\0zero\0characters";

另一种序列使用反斜杠后跟字母 'x' 和一个或两个十六进制数字,表示具有指定代码的字符。使用这种语法,例如,你可以将零字节写为 '\x0'
编辑:重新阅读问题,还支持八进制的常量。它们使用反斜杠后跟数字零,就像八进制整数常量一样。因此,'\00''\0' 的同义词。
当你需要构建包含非打印字符或特殊控制字符的字符串时,这有时会很有用。
还有一组单个字符的“命名”特殊字符,例如换行符 '\n'、制表符 '\t' 等。

如果你想写 "this\0has\00 chars",那么 \00 会被解释为一个字节的 '\0' 还是 '\0' 和 '0' 两个字符?八进制转义序列的长度限制是多少? - strager
@strager,我不知道那个,但你可以使用<"this\0has"0 chars">,因为C语言会将它们连接在一起。 - paxdiablo
但是C语言只会从<"this\0has\00 chars">中读取这个,因为它会获取到空值\0,这也是任何字符串结束的测试条件。你所说的“你可以将零字节写成'\x0'”是什么意思?谢谢回复! - mawia

5

这些字符用于在编辑器中书写无法打印的字符。对于标准字符,它可以是各种控制字符,对于wchar,它可能是编辑器字体中没有表示的字符。

例如,在Visual Studio 2005中编译如下代码:

    const wchar_t bom = L'\xfffe';     /* Unicode byte-order marker */
    const wchar_t hamza = L'\x0621';   /* Arabic Letter Hamza */
    const char start_of_text = '\002'; /* Start-of-text */
    const char end_of_text = '\003';   /* End-of-text */

编辑:使用八进制字符文字有一个有趣的注意点。 八进制数字似乎不能超过三位数,这人为地限制了我们可以输入的字符。

例如:

        /* Letter schwa; capital unicode code point 0x018f (octal 0617)
         *               small unicode code point   0x0259 (octal 1131) 
         */
    const wchar_t Schwa2 = L'\x18f';    /* capital letter Schwa, correct */
    const wchar_t Schwa1 = L'\617';     /* capital letter Schwa, correct */
    const wchar_t schwa1 = L'\x259';    /* small letter schwa, correct */
    const wchar_t schwa2 = L'\1131';    /* letter K (octal 113), incorrect */

3

八进制是基数为8(使用数字0-7),因此每个数字是3位:

\0354 = 11 101 100

十六进制是基数为16(使用数字0-9,A-F),每个数字是4位:

\x23 = 0010 0011

在C字符串(char数组/指针)中,它们通常用于编码无法轻松表示的字节。

因此,如果您想要一个使用ASCII代码(如STX和ETX)的字符串,可以执行以下操作:

char *msg = "\x02Here's my message\x03";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接