代码:
int fd;
fd = open("fruit", O_WRONLY);
write(fd, "apple", sizeof("apple"));
close(fd);
我用编译它
$ gcc test.c -o test
并作为运行
$ ./test
然后我打开fruit
文件,在文件中看到以下内容:
apple^@
^@
是什么意思?
它是空字符代码' '
。某些编辑器(如vi(将其显示为^@
。
sizeof("apple")
将返回6,因为它包含用于终止字符串的空字符。
^@
是ASCII NUL通常以可打印形式表示的方式。这与删除了一些位的@
字符相同:
@ = 0100
^@ = 0
并且它与CCD_ 8(C中的字符串终止符(相同。因为它是字符串终止符,所以您不会从printf
或其相关函数中看到它,但您可以使用面向块的write
轻松创建它。例如,您可以编写
write(fd,"apple orange",sizeof("apple orange"));
并看到
apple^@orange^@
因为C中的每个双引号文本都有一个尾部字符串终止符,该终止符按其大小计算。如果你想在没有终止符的情况下编写字符串,你可以这样做:
const char *s = "apple";
write(fd,s,strlen(s));
从而消除了示例中的两个问题:(a(不正确的长度和(b(通过确保两者都是同一项,可能使用不一致的字符串内容和长度。有关(a(的一些注释,请参见Sizeof string literal。
NUL
是32个ASCII控制字符之一,其值范围从0到31,称为C0控件。所有这些ASCII控制字符通常以这种方式显示(对于可打印形式(,使用对应于将64(0100(添加到控制字符值的字符。
ASCII DEL
是127(0177(。将其显示为^?
是一种特殊情况,它比其他ASCII控制字符更新。例如,X/Open terminfo(curses(没有为这个字符定义可打印的形式,尽管它为其他字符定义了可打印的格式。与其他ASCII控制字符不同,DEL
是通过对字符中的所有(七(位进行"或"运算而形成的。
ASCII当然是一个7位代码。制定了许多其他守则;ASCII对应于POSIX可移植字符集,因此它经常遇到。
通过网络搜索很容易找到ASCII字符表。这些表格中的大多数(或其附带的讨论(都变成了错误信息。这里有一个链接到一个相当真实的页面,标题为ASCII字符集。它表示
Control键从其修改的键的值中减去64。
然而,只有当密钥是集合@
、A
、B
等中的一个密钥时,该语句才是正确的。如果将其应用于其他密钥,则结果可能很有趣,但并不有用。相反,在C程序中,您可以进行逻辑屏蔽,例如
ch = ch & 037;
以获得0到31范围内的字符。