我有一个代码可以将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。
我做错了什么?我怎样才能修补我的代码?
答案 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()
有很多帮助。