null终止char(\ 0)和`^ @`之间的区别

时间:2013-02-10 07:10:11

标签: c++ c arrays string char

我的代码是这样的:

#include <iostream>
using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
    cout << (int)('\0') << endl;
    cout << (char)(0) << endl;
    return 0;
}

我希望在终端上看到这样的话:

$ test-program
0

$ 

但是,我看到的是这样的:

$ test-program
0
^@
$

令我困惑的是,我认为'\0'可以转换为00也可以投放到\0。我希望看到一个空字符后跟endl,但结果是奇怪的^@

有没有人有这方面的想法?

4 个答案:

答案 0 :(得分:12)

^@就是终端模拟器呈现'\0'的方式。

答案 1 :(得分:7)

^@是空字符的常见表示。同样,^A用于表示序数值为1的字符,^G表示序数值为7(bell)的字符,^M表示序数值为13的字符(回车率) )。

cout << (char)0

只是打印字符表示,而不是整数表示

答案 2 :(得分:1)

如果你正在查看终端的输出,你不知道你的程序是不是按预期运行,也可能只是你的终端模拟器。

在UNIXoid系统上,使用./myProgram | hexdump -C查看十六进制输出。通过这种方式,您可以确保您的程序执行您期望的操作,因此终端的行为不符合您的期望:

00000000  30 0a 00 0a                                       |0...|
00000004

如果您看到的输出与我相同,则实际上打印的是零'0',换行符'\n',空'\0',换行符'\n'。所以在这种情况下,你的程序就像你期望的那样。

您可能想尝试不同的终端模拟器或设置。

答案 3 :(得分:0)

如果您将0投射到char,则不会生成'0',但'\0' - 请记住从整数类型转换为char使用该ASCII代码创建char。 所以基本上,第二行输出一个空字符(ASCII 0)。

如果要输出'0'字符,则需要执行(char) 48之类的操作,因为48恰好是字符0的ASCII值。