stringstream sgetn在iOS 5.1上返回NULL

时间:2012-03-26 13:41:25

标签: c++ ios llvm objective-c++

我有一个代码可以将std::stringstream的内容复制到char * dest

    static size_t copyStreamData(std::stringstream & ss, char * const & source, char * dest)
    {
        ss.str("");
        ss.clear();
        ss << source;
        size_t ret = ss.rdbuf()->sgetn( dest, (std::numeric_limits<size_t>::max)() ) ;
        dest[ret] = 0;
        return ret;
    }

在iOS 5.0及更低版本上,它可以正常工作......但在iOS 5.1中它返回NULL。

我做错了什么?我怎样才能修补我的代码?

2 个答案:

答案 0 :(得分:2)

你要做的事情与做的基本相同:

std::size_t length = std::strlen(source) + 1; // + 1 for '\0'
std::copy(source, source + length, dest);
// Assuming dest has length + 1 bytes allocated for it

我怀疑sgetn返回NULL,因为sgetn返回std::streamsize而不是指针类型。是返回0,还是另一个函数返回NULL?您是否尝试在调用rdbuf()之前刷新流?

答案 1 :(得分:1)

您应该选择字符串表示。

如果由于某些原因必须使用C字符串,那么您的函数将被称为strncpy

std::strncpy(dest, source, max_size_of_dest);

阅读链接中的警告。

但是,如果您可以使用更好的抽象,那么我们鼓励您转到std::string

void copy(std::string const& source, std::string& dest) { dest = source; }

不必处理缓冲区长度(因此不会更频繁地搞乱)是一个非常强大的帮助。

请注意,没有什么可以阻止您在应用程序中操作std::string并仍然使用C方法进行通信:.c_str()有很多帮助。