字符常量:\ 000 \ xhh
任何人都可以解释字符常量\ 000和\ xhh的用法,即字符常量中的八进制数和hex数?
在C中,字符串由值为零(0)的字符终止。 这可以写成这样:
char zero = 0;
但这在字符串中不起作用。 在字符串文字中使用了一种特殊的语法,其中反斜杠用作转义序列的引入,后面跟着各种各样的东西。
一个这样的序列是“反斜杠零”,它只是表示值为零的字符。 因此,你可以写这样的东西:
char hard[] = "this\0has embedded\0zero\0characters";
另一个序列使用反斜杠后跟字母'x'
和一个或两个hex数字来表示带有指定代码的字符。 使用此语法,您可以将零字节写为'\x0'
。
编辑 :重新阅读这个问题,也有基数为8的常量支持,即八进制。 它们使用反斜杠后跟数字零,就像八进制文字整数常量一样。 '\00'
是'\0'
的同义词。
当您需要构造包含非打印字符或特殊控制字符的字符串时,这有时很有用。
还有一组单字符“命名”特殊字符,例如换行符为'\n'
'\t'
,TAB为'\t'
,依此类推。
那些将用于在编辑器中编写其他不可打印的字符。 对于标准字符,这将是各种控制字符,对于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 */
八进制是基数8(使用数字0-7)所以每个数字是3位:
\ 0354 = 11 101 100
hex是基数16(使用数字0-9,AF),每个数字是4位:
\ x23 = 0010 0011
在C字符串(字符串数组/指针)中,它们通常用于编码无法轻易表示的字节。
因此,如果您想要一个使用ASCII代码(如STX和ETX)的字符串,您可以执行以下操作:
char *msg = "\x02Here's my message\x03";