Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ 为什么.c#u str()不添加'\0';在一根绳子的末端?_C++_C Strings - Fatal编程技术网

C++ 为什么.c#u str()不添加'\0';在一根绳子的末端?

C++ 为什么.c#u str()不添加'\0';在一根绳子的末端?,c++,c-strings,C++,C Strings,当运行此代码时,我会得到“Hello Worldaaa”,但根据.c_str()函数的工作,字符串a应该是“Hello World\0”,字符串b应该是Hello World\0aaa”因此输出中不应该显示“aaa” #include <bits/stdc++.h> using namespace std; int main() { string a = "Hello World"; a = a.c_str(); string b = a + strin

当运行此代码时,我会得到
“Hello Worldaaa”
,但根据
.c_str()
函数的工作,字符串a应该是
“Hello World\0”
字符串b
应该是
Hello World\0aaa”
因此
输出中不应该显示“aaa”

#include <bits/stdc++.h>

using namespace std; 

int main()
{
    string a = "Hello World";
    a = a.c_str();
    string b = a + string("aaa");

    cout << b;

    return 0;
}
#包括
使用名称空间std;
int main()
{
字符串a=“Hello World”;
a=a.c_str();
字符串b=a+字符串(“aaa”);

cout这将是不直观的。请记住,用户没有显式使用终止空字符。语言的语法添加了它

如果
“abcd”+“xyz”
的结果是
“abcd\0xyz”
而不是直观的结果-
“abcdxyz”
,则会造成很多混乱

在C和C++中,连接两个字符串意味着忽略字符串中第一个字符串的终止空字符。看看文档,它是空字符的明文,而代码<>:ST:::运算符+< /COD>不是。

< P>不完全…

让我们看看这一行:

a = a.c_str();
您有一个
std::string
,您正试图将
const char*
分配给它。因此您将使用的重载(3)。但这并不会神奇地改变
a
的类型。换句话说,我们仍然有一个
std::string

因此该行实际上根本不修改
a
的值

然后使用添加两个
std::string
。这将导致另一个
std::string
,它是第一个附加第二个,这正是您所拥有的

我不清楚您试图在这里实现什么,但是如果您使用这些值创建了一个c字符串:

const char cstr[] = "Hello World\0aaa";

然后试着把它打印出来,你就能准确地看到你想要的东西。

是的,你说得对

的确

返回指向以null结尾的字符数组的指针,该数组的数据与字符串中存储的数据等效

然而,有一些考虑可能会误导您


首先,声明:

a = a.c_str();
在语义上是一个no操作。 您将获得
常量字符*
(即
“Hello World\0”
)并将其分配给
a
。 但是,<代码> A<代码>是<代码> STD::String ,它是一个设计用来抽象C++中的“字符串类型”的类,它透明地处理了 > 0 '/Cuth>,用户不应该关心IT1的管理。 诀窍就在里面

将内容替换为s指向的以null结尾的字符串的内容,就像通过赋值(s,Traits::length(s))一样


最后一点,关于

与前面一样,在本例中,运算符
std::string::operator+
将处理
'\0'

简而言之,它的行为类似于:

"Hello World\0" + "aaa\0"  ===> "Hello Worldaaa\0"
它将关注“内部
'\0'
”返回一致的以null结尾的字符串



1除非他/她正在玩内存。

它会玩,但在
std::string操作符+(const char*,const std::string&)中使用它。
忽略终止的
'\0'
字符以产生结果。它实际上不是
.c\u str()
,实际上是构造器让你感到困惑。真正有趣的部分可能是重复的,这是将
\0
字符显式存储在
std::string
@πάντα中的解决方法ῥεῖ, 我敢肯定,对计算机科学/编程语言理论更感兴趣的人已经考虑过了。不是我。真的,需要指出的是,在“NUL终止字符串”中,NUL终止符不被视为字符串数据的一部分。它只是一个字符串结束指示符。也就是说,
“Hello World”
“Hello World\0”
是不同的字符串;后者有一个嵌入的NUL字符,它是实际字符串的一部分。
"Hello World\0" + "aaa\0"  ===> "Hello Worldaaa\0"