文件中的“^@”是什么意思?
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.
但是,只有当键是 @
、A
、B
等集合中的键之一时,该语句才是正确的。如果将其应用于其他键,结果可能很有趣但没有用。相反,在 C 程序中你会做一个逻辑掩码,例如,
ch = ch & 037;
获取0到31范围内的一个字符。
代码:
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.
但是,只有当键是 @
、A
、B
等集合中的键之一时,该语句才是正确的。如果将其应用于其他键,结果可能很有趣但没有用。相反,在 C 程序中你会做一个逻辑掩码,例如,
ch = ch & 037;
获取0到31范围内的一个字符。