文件中"^ @"是什么意思?

Ren*_*Ren 21 c gcc ascii control-characters

码:

int fd;
fd = open("fruit", O_WRONLY);
write(fd, "apple", sizeof("apple"));
close(fd);
Run Code Online (Sandbox Code Playgroud)

我用它编译它

$ gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

并运行

$ ./test   
Run Code Online (Sandbox Code Playgroud)

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

apple^@
Run Code Online (Sandbox Code Playgroud)

什么^@意思?

kee*_*ety 41

它是空字符代码'\0'.像vi这样的某些编辑器将其显示为^@.

sizeof("apple") 将返回6,因为它包含用于终止字符串的空字符.


Tho*_*key 38

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

@ = 0100
^@ = 0
Run Code Online (Sandbox Code Playgroud)

它与'\0'(C中的字符串终止符)相同.因为它是字符串终止符,所以你不会从它printf或它的相关函数中看到它,但是你可以使用面向块的方法来创建它write.例如,你可以写

write(fd,"apple\0orange",sizeof("apple\0orange"));
Run Code Online (Sandbox Code Playgroud)

并看到了

apple^@orange^@
Run Code Online (Sandbox Code Playgroud)

因为C中的每个双引号文字都有一个尾随字符串终止符,它的大小也是计算的.如果您打算在没有终结符的情况下编写字符串,那么您可以这样做:

const char *s = "apple";
write(fd,s,strlen(s));
Run Code Online (Sandbox Code Playgroud)

从而消除了示例中的两个问题:(a)不正确的长度和(b)通过确保两者是相同的项目可能使用不一致的字符串内容和长度.有关(a)的一些注释,请参见字符串文字的大小.

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可移植字符集,因此经常遇到它.

通过Web搜索很容易找到ASCII字符表.大多数这些表格(或其随附的讨论)都会转向错误信息.这是一个名为ASCII字符集的合理事实页面的链接.它指出

Control键从它修改的键的值中减去 64.

但是,如果关键是那些从集合的一个语句是唯一正确的@,A,B等如果您应用到其它键,结果也许是有趣的,但没有用.相反,在C程序中,您将进行逻辑屏蔽,例如,

ch = ch & 037;
Run Code Online (Sandbox Code Playgroud)

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

  • 我的浏览器会在您的评论中显示这些内容,但它们是小写的,只有可读,因为我知道您的意图. (2认同)