为什么.c_str()不在字符串末尾添加'\ 0'?

时间:2019-03-06 17:42:23

标签: c++ c-strings

运行此代码时,我得到"Hello Worldaaa",但是根据.c_str()函数的工作,string a应该是"Hello World\0",而string 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;
}

3 个答案:

答案 0 :(得分:4)

是的,关于 std::string::c_str

确实

  

返回一个指针,该指针指向以空值结尾的字符数组,该数组的数据等于存储在字符串中的数据。

但是,有一些注意事项可能会误导您。


首先,声明:

a = a.c_str();

在语义上是无操作。 您得到const char*(即"Hello World\0")并将其分配给a。 但是astd::string,它是一个类,旨在抽象C ++中的“字符串类型”。它自动透明地处理'\0'。用户不应该关心它的管理 1

把戏在std::string::operator=(const char*)内部。

  

将内容替换为s 所指向的以空终止的字符串,就好像是通过Assign(s,Traits :: length(s))一样。

>

最后一点,大约string concatenation

a + string("aaa");

像以前一样,在这种情况下,运算符std::string::operator+将处理'\0'

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

"Hello World\0" + "aaa\0"  ===> "Hello Worldaaa\0"

它将关心“内部'\0'”是否返回一个以null结尾的字符串。


1 除非他/她正在使用内部存储器。

答案 1 :(得分:1)

那是不直观的。请记住,用户未明确使用终止空字符。该语言的语法已添加。

如果"abcd" + "xyz"的结果最终是"abcd\0xyz"而不是直观的结果"abcdxyz",则会引起很多混乱。

在C和C ++中,连接两个字符串意味着忽略结果字符串中第一个字符串的终止空字符。看一下strcat的文档。明确指出了空字符,而std::string::operator+的文档却没有。

答案 2 :(得分:0)

不太...

让我们看看这一行:

a = a.c_str();

您有一个std::string试图分配给const char*。因此,您将使用the std::string assignment operator的重载(3)。但这并不能神奇地改变a的类型。换句话说,我们还有std::string

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

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

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

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

并尝试打印它,您会确切地看到期望的结果。