C++ 以null结尾的字符(\0)和`^@`
我的代码如下:C++ 以null结尾的字符(\0)和`^@`,c++,c,arrays,string,char,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 ^@
#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
^@
$
然而,我看到的是这样的:
#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'
可以转换为0
。而0
也可以被强制转换为\0
。我希望看到一个空字符后跟一个endl
,但结果有些奇怪,比如^@
有人对此有想法吗?
^@
就是终端仿真器呈现'\0'
的方式。如果将0
转换为char
,它不会生成'0'
,但是'\0'
——请记住,将整型类型转换为char
将使用该ASCII代码创建一个char
。
所以基本上,第二行输出一个空字符(ASCII 0)
如果要输出
'0'
字符,则需要执行类似(char)48的操作,因为48恰好是字符0的ASCII值。^@
是空字符的常见表示形式。类似地,^A
用于表示序号值为1的字符,^G
用于表示序号值为7(钟形)的字符,^M
用于表示序号值为13(回车)的字符
cout如果您正在查看终端的输出,您不知道是您的程序的行为不符合预期,还是您的终端模拟器
在UNIXoid系统上,使用/myProgram | hextump-C
查看十六进制输出。通过这种方式,您可以确保您的程序执行您期望它执行的操作,因此终端的行为与(您)期望的不同:
00000000 30 0a 00 0a |0...|
00000004
如果您看到的输出与我看到的相同,那么实际上您正在打印一个零'0'
、换行符'\n'
、空'\0'
、换行符'\n'
。因此,在本例中,您的程序的行为符合您的预期
您可能需要尝试不同的终端模拟器或设置。我在Windows中获得了预期的结果(使用MinGW gcc编译)。使用| hextump-C
查看十六进制输出。这样你就可以确保你的程序做你期望的事情,所以它的终端不像你预期的那样。这是C++,然后是类型问题。在第一种情况下,必须显示整数0,然后将0转换为测试“0”。在第二种情况下,它是一个真正的字符0,实际上是一个字符0。测试程序>结果。将emacs与--hexl模式一起使用,它将确认这一点。第二点是字符0的终端显示可能会有所不同,在您的情况下,字符0(通常不应显示,因为在C中,字符的结尾是一个字符串)将显示为^@。OP知道他正在打印空字符,或者至少我认为他写问题的方式是这样的。那么第一行是错误的,因为在这种情况下,它显示的是零整数,它与零字符不同。