Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以null结尾的字符(\0)和`^@`_C++_C_Arrays_String_Char - Fatal编程技术网

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知道他正在打印空字符,或者至少我认为他写问题的方式是这样的。那么第一行是错误的,因为在这种情况下,它显示的是零整数,它与零字符不同。