代码:
int fd;
fd = open("fruit", O_WRONLY);
write(fd, "apple", sizeof("apple"));
close(fd);
我用
编译它$ gcc test.c -o test
并以
运行$ ./test
然后我打开fruit
文件,我在文件中看到以下内容:
apple^@
^@
是什么意思?
答案 0 :(得分:40)
这是空字符代码'\0'
。某些编辑器如vi将其显示为^@
。
sizeof("apple")
将返回6,因为它包含用于终止字符串的空字符。
答案 1 :(得分:38)
^@
是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)通过确保两者是相同的项目可能使用不一致的字符串内容和长度。有关(a)的一些评论,请参阅 Sizeof string literal 。
NUL
是32个ASCII控制字符之一,其值范围为0到31,称为 C0控件。
所有这些ASCII控制字符通常以这种方式显示(对于可打印的形式),使用对应于将64(0100)添加到控制字符值的字符。
ASCII DEL
是127(0177)。将其显示为^?
是一种特殊情况,它比其他ASCII控制字符更新。例如,X / Open terminfo(curses)没有为这个角色定义可打印的形式,尽管它适用于其他角色。与其他ASCII控制字符不同,DEL
是通过对所有(七)位进行OR运算形成的。
当然,ASCII是一个7位代码。制定了许多其他代码; ASCII对应于POSIX portable character set,因此经常遇到。
通过网络搜索很容易找到ASCII字符表。大多数这些表格(或其随附的讨论)都会转向错误信息。以下是指向合理事实页面的链接,标题为ASCII Character Set。它声明
Control键从其修改的键值中减去 64。
但是,如果密钥是集@
,A
,B
等中的密钥之一,则该语句才正确。如果将其应用于其他密钥,则结果也许有趣但没用。相反,在C程序中,您将进行逻辑屏蔽,例如,
ch = ch & 037;
获取0到31范围内的字符。