为什么在std字符串中间设置null没有任何效果

时间:2011-01-11 02:56:57

标签: c++ stdstring

考虑

#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相同。就是这样,在字符串中间插入空字符,将“终止”字符串。但事实并非如此。我的期望是错的吗?

5 个答案:

答案 0 :(得分:9)

std::string与通常的C字符串不同,可以包含嵌入的NUL字符而不会出现问题。但是,如果您这样做,您会注意到如果您使用.c_str()函数返回const char *,字符串会提前终止。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

@Lou是对的:不要这样做。相反,这样做:

b.erase (3, b.length());

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

为什么呢?文档中的任何内容,无论在何处,与std :: string有关,都表示它会这样做。

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