最后没有空字符的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()
答案 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;
}
答案 1 :(得分:0)
虽然有可能有非空终止字符串我不推荐它,字符串是空的终止有充分理由,我实际上建议你在这个例子中继续正确编写函数或与...取得联系第三方并让他们解决它。
回答你的问题是的,std :: string如果没有空终止是有效的,为了达到这个目的,你可以使用加载了最大长度的字符串副本的重载,再一次我不推荐这个。
有关详细信息,请参阅此页面: http://c2.com/cgi/wiki?NonNullTerminatedString
答案 2 :(得分:-1)
这是一个非常晚的答案,但我只是发布它,以便后来的任何人都可以使用它作为参考。如果将一个以null结尾的字符串写入string.data()
数组,它将终止string
并且如果需要,将不允许您继续连接字符串。解决问题的方法已经回答了问题。
str.resize(str.size() - 1);
这可以解决问题,我已在我的代码中测试过了。