std :: string没有null-character

Seb*_*ann 1 c++ string

std::string最终没有空字符是否有效,可以像这样获取吗?:

std::string str = "Hello World";
str.resize(str.size() - 1);
Run Code Online (Sandbox Code Playgroud)

对于那些好奇的人:

我有一个第三方函数接受一个字符串并迭代字符(使用迭代器).不幸的是,该函数是错误的(因为它是一个开发版本)并且不能处理空字符.我没有其他签名可供选择,我无法修改功能(正如我所说,第三方,我们不想分叉),同时我不想重新发明轮子.据我所知,该函数应该在没有null字符的情况下按预期工作,所以我想至少尝试一下.

迭代发生如下:

bool nextChar(CharIntType& c)
{
    if (_it == _end) return false;
    c = *_it;
    ++_it;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

其中,_it被初始化为std::string::begin()_endstd::string::end()

kfs*_*one 5

在C++ 11之前,std :: string在你调用之前不需要包含尾随nul c_str().

http://en.cppreference.com/w/cpp/string/basic_string/data

的std :: string ::数据()

返回指向用作字符存储的基础数组的指针.指针是范围[data(); data()+ size())有效,其中的值对应于存储在字符串中的值.

返回的数组不需要以null结尾.如果empty()返回true,则指针是非空指针,不应解除引用.(直到c ++ 11)

返回的数组以空值终止,即data()和c_str()执行相同的功能.如果empty()返回true,则指针指向单个空字符.(自c ++ 11起)

由此我们可以确认std :: string :: size不包含任何nul终止符,并且std :: string :: begin()和std :: string :: end()描述了您实际查找的范围.

我们还可以通过std :: string :: back()不返回nul字符的简单事实来确定这一点.

#include <iostream>
#include <string>

int main() {
    std::string s("hello, world");
    std::cout << "s.front = " << s.front() << " s.back = " << s.back() << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/nUX0AB