文件中“^ @”是什么意思?

时间:2015-05-17 00:25:53

标签: c gcc ascii control-characters

代码:

int fd;
fd = open("fruit", O_WRONLY);
write(fd, "apple", sizeof("apple"));
close(fd);

我用

编译它
$ gcc test.c -o test

并以

运行
$ ./test   

然后我打开fruit文件,我在文件中看到以下内容:

apple^@

^@是什么意思?

2 个答案:

答案 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。

但是,如果密钥是集@AB等中的密钥之一,则该语句才正确。如果将其应用于其他密钥,则结果也许有趣但没用。相反,在C程序中,您将进行逻辑屏蔽,例如,

ch = ch & 037;

获取0到31范围内的字符。