5

考虑

#include <string>
#include <iostream>

int main()
{
    /*
    hello
    5
    hel
    3
    */
    char a[] = "hello";
    std::cout << a << std::endl;
    std::cout << strlen(a) << std::endl;
    a[3] = 0;
    std::cout << a << std::endl;
    std::cout << strlen(a) << std::endl;

    /*
    hello
    5
    hel o
    5
    */
    std::string b = "hello";
    std::cout << b << std::endl;
    std::cout << b.length() << std::endl;
    b[3] = 0;
    std::cout << b << std::endl;
    std::cout << b.length() << std::endl;

    getchar();

}

我希望std::string其行为与char数组 a 相同。就是这样,在字符串中间插入空字符,将“终止”字符串。然而,事实并非如此。我的期望错了吗?

4

5 回答 5

9

Astd::string不像通常的 C 字符串,可以毫无问题地包含嵌入的 NUL 字符。但是,如果您这样做,您会注意到如果您使用该.c_str()函数返回一个const char *.

于 2011-01-11T03:01:45.643 回答
4

否 - std::strings 不像 C“字符串”那样以 NUL 结尾;std::string 独立记录其长度。

于 2011-01-11T03:01:15.457 回答
2

@Lou 是对的:不要那样做。相反,请执行以下操作:

b.erase (3, b.length());
于 2011-01-11T03:03:52.413 回答
0

是的,你的期望是错误的。 std::string旨在与 C 字符串不同(例如不一定存储在连续的内存/数组中)。

要复制第一部分的行为,请尝试std::cout << b.c_str()代替std::cout << b.

于 2011-01-11T03:01:11.493 回答
0

我希望 std::string 的行为与 char 数组 a 相同。

为什么?与 std::string 有关的任何地方的文档中都没有说它这样做。

我的建议,停止像 C++ 一样对待 C 加上一些东西。

于 2011-01-11T03:08:13.333 回答