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

What does the "^@" mean in file?

代码:

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

我用

编译它
$ gcc test.c -o test

和运行作为

$ ./test   

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

apple^@

^@ 是什么意思?

是空字符码'[=10=]'vi 等某些编辑器将其显示为 ^@

sizeof("apple") 会 return 6 因为它包含用于终止字符串的空字符。

^@ 是 ASCII NUL 通常以可打印形式表示的方式。这与删除了一些位的 @ 字符相同:

@ = 0100
^@ = 0

'[=17=]'(C中的字符串终止符)相同。因为它是字符串终止符,所以您不会从 printf 或其相关函数中看到它,但您可以使用 block-oriented write 轻松创建它。例如,您可以编写

write(fd,"apple[=11=]orange",sizeof("apple[=11=]orange"));

看过

apple^@orange^@

因为 C 中的 每个 double-quoted 文字都有一个尾随的字符串终止符,它被计入其大小。如果您打算编写不带终止符的字符串,您可以这样做:

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 portable character set,所以经常遇到。

通过网络搜索很容易找到 ASCII 字符表。这些表格中的大多数(或它们附带的讨论)都偏离了错误信息。这是一个 link 到一个合理的事实页面,标题为 ASCII Character Set。它指出

The Control key subtracts 64 from the value of the keys that it modifies.

但是,只有当键是 @AB 等集合中的键之一时,该语句才是正确的。如果将其应用于其他键,结果可能很有趣但没有用。相反,在 C 程序中你会做一个逻辑掩码,例如,

ch = ch & 037;

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