2014-01-20 26 views
1

字符串是std::string没有最终有效空字符和能不能像这样的收购?:的std ::没有空字符

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

对于那些谁是好奇:

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

迭代发生这样的:

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

_it哪里被初始化为std::string::begin()_endstd::string::end()

+1

我会假设第二线将删除“d”字符。 – lisyarus

+0

最后,你的意思是'str [str.size()]'?或'str.back()'? –

+1

从C++ 11开始,应该总是在最后一个隐藏的空字符。尽管如此,没有任何一个迭代器会遇到,而不是该类的用户所关心的字符串的一部分。另外,'pop_back'将完成这段代码的工作。 – chris

回答

5

直到C++ 11,是不需要的std :: string到包括后NUL直到你打电话给c_str()

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

的std :: string ::数据()

返回指针到作为字符存储底层数组。指针是这样的范围[data(); data()+ size())是有效的,并且其中的值与存储在字符串中的值相对应。

返回的数组中不要求是空终止。 如果empty()返回true,则指针是不应解除引用的非空指针。 (直至C++ 11)

返回的数组是空终止,即,数据()和c_str()执行相同的功能。 如果empty()返回true,则指针指向单个空字符。 (自C++ 11)

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

我们还可以通过一个简单的事实的std :: string ::回()不返回NULL字符确定这一点。

#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

+0

它看起来像某个地方,当一个额外的空字符发现它进入我的字符串(该字符串经历了大量的代码,它至少在电线上发送两次),而'pop_back()'帮助在这种情况下,你的答案是正确的,并回答了原来的问题,更重要的是,我在这里得到的答复(包括你的回答)帮助我找到并解决了实际问题,因此我接受了你的回答 – Paranaix

+0

啊 - 是啊 - 你当然可以将'\ 0'写入底层ch ar数组,如果你用一个字符串来构造它并将其传递给len + 1,它会将'\ 0'复制到'string'中。总是发现它有点烦人,std :: string同时具有长度和大小,并且它们都是相同的值。 – kfsone

0

虽然可能有非空值终止字符串我不会推荐它,字符串空终止一个很好的理由,我想其实在这种情况下建议你要么继续前进,正确写入功能或与第三方取得联系并让他们修复。

回答您的问题是一个std :: string是有效的,如果它不是空终止,实现这一点,你可以使用的字符串拷贝过载与下载的最大长度,再次我不推荐这个。

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

相关问题