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"