c语言 - 文件中的"^@"是什么意思?



代码:

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,"appleorange",sizeof("appleorange"));

并看到

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。

然而,只有当密钥是集合@AB等中的一个密钥时,该语句才是正确的。如果将其应用于其他密钥,则结果可能很有趣,但并不有用。相反,在C程序中,您可以进行逻辑屏蔽,例如

ch = ch & 037;

以获得0到31范围内的字符。

相关内容

  • 没有找到相关文章

最新更新