^@ 是 ASCII NUL 通常以可打印形式表示的方式。这与删除了一些位的@ 字符相同:
@ = 0100
^@ = 0
它与'\0'(C 中的字符串终止符)相同。因为它是字符串终止符,您不会从printf 或其相关函数中看到它,但您可以使用面向块的write 轻松创建它。例如,你可以写
write(fd,"apple\0orange",sizeof("apple\0orange"));
见过
apple^@orange^@
因为 C 中的 每个 双引号文字都有一个尾随字符串终止符,该终止符计入其大小。如果您打算编写没有终止符的字符串,您可以这样做:
const char *s = "apple";
write(fd,s,strlen(s));
从而消除示例中的两个问题:(a) 长度不正确和 (b) 通过确保两者是相同的项目,可能使用不一致的字符串内容和长度。请参阅 Sizeof string literal 了解 (a) 上的一些 cmets。
NUL 是 32 个 ASCII 控制字符之一,其值范围为 0 到 31,称为 C0 控件。
所有这些 ASCII 控制字符通常都以这种方式显示(对于可打印的表单),使用对应于将 64 (0100) 添加到控制字符的值的字符。
ASCII DEL 是 127 (0177)。将其显示为 ^? 是一种特殊情况,它比其他 ASCII 控制字符更新。例如,X/Open terminfo (curses) 没有为这个字符定义一个可打印的形式,尽管它为其他字符定义了一个可打印的形式。与其他 ASCII 控制字符不同,DEL 是通过对字符的所有(七)位进行“或”运算而形成的。
当然,ASCII 是 7 位代码。开发了许多其他代码; ASCII对应POSIX portable character set,所以经常遇到。
通过网络搜索很容易找到 ASCII 字符表。这些表格中的大多数(或其随附的讨论)都转向了错误信息。这是一个链接到一个合理的事实页面,标题为ASCII Character Set。它指出
Control 键从它修改的键的值中减去 64。
但是,只有当键是集合中的一个时,该语句才是正确的 @、A、B 等。如果将其应用于其他键,结果可能很有趣但没用.相反,在 C 程序中你会做一个逻辑屏蔽,例如,
ch = ch & 037;
获取 0 到 31 范围内的字符。