stringstream-sgetn在iOS 5.1上返回NULL

stringstream sgetn returns NULL on iOS 5.1

本文关键字:返回 NULL iOS stringstream-sgetn      更新时间:2023-10-16

我有一个代码,可以将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。

我做错了什么?还有我如何修补我的代码?

您要做的基本上与正在做的相同:

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

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

您应该选择您的字符串表示。

如果由于某些原因必须使用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()帮助很大。