【问题标题】:What does the "^@" mean in file?文件中的“^@”是什么意思?
【发布时间】:2015-07-28 17:04:01
【问题描述】:

代码:

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

我用它编译

$ gcc test.c -o test

并运行为

$ ./test   

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

apple^@

^@ 是什么意思?

【问题讨论】:

标签: c gcc ascii control-characters


【解决方案1】:

它是空字符代码'\0'vi 等某些编辑器将其显示为 ^@

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

【讨论】:

    【解决方案2】:

    ^@ 是 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) 通过确保两者是相同的项目,可能使用不一致的字符串内容和长度。请参阅 Sizeof string literal 了解 (a) 上的一些 cmets。

    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 字符表。这些表格中的大多数(或其随附的讨论)都转向了错误信息。这是一个链接到一个合理的事实页面,标题为ASCII Character Set。它指出

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

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

    ch = ch & 037;
    

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

    【讨论】:

    • DEL 也是,可以显示为^?(在这种情况下,0x40 位被清除而不是设置)。
    • 考虑在第 4 段中添加“因为没有 已定义 可打印的表格”:)
    • 顺便说一句——Unicode 为控制字符提供 define 符号字符:␀ ␡(不过,您的浏览器可能不会显示它们。)
    • 我的浏览器会在您的评论中显示这些内容,但它们是小写字母,并且只能读取,因为我知道您的意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多