std :: string没有null-character

时间:2014-01-20 21:49:38

标签: c++ string

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

std::string str = "Hello World";
str.resize(str.size() - 1);

对于那些好奇的人:

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

迭代发生如下:

bool nextChar(CharIntType& c)
{
    if (_it == _end) return false;
    c = *_it;
    ++_it;
    return true;
}

其中_it初始化为std::string::begin()_end初始化为std::string::end()

3 个答案:

答案 0 :(得分:5)

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

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

  

的std :: string ::数据()

     

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

     

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

     

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

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

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

#include <iostream>
#include <string>

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

http://ideone.com/nUX0AB

答案 1 :(得分:0)

虽然有可能有非空终止字符串我不推荐它,字符串是空的终止有充分理由,我实际上建议你在这个例子中继续正确编写函数或与...取得联系第三方并让他们解决它。

回答你的问题是的,std :: string如果没有空终止是有效的,为了达到这个目的,你可以使用加载了最大长度的字符串副本的重载,再一次我不推荐这个。

有关详细信息,请参阅此页面: http://c2.com/cgi/wiki?NonNullTerminatedString

答案 2 :(得分:-1)

这是一个非常晚的答案,但我只是发布它,以便后来的任何人都可以使用它作为参考。如果将一个以null结尾的字符串写入string.data()数组,它将终止string并且如果需要,将不允许您继续连接字符串。解决问题的方法已经回答了问题。

  str.resize(str.size() - 1); 

这可以解决问题,我已在我的代码中测试过了。