如何将字符串流内容放入char而不是字符串类型
How to put stringstream contents into char instead string type?
每个人都知道stringstream.str()
需要一个字符串变量类型来存储stringstream.str()
的内容。
我想将stringstream.str()
的内容存储到char变量或char数组或指针中。
有可能做到吗?
请写一个简单的例子和你的答案。
为什么不只是
std::string s = stringstream.str();
const char* p = s.c_str();
编辑:请注意,您不能在函数之外自由给定p
:它的生存期与s
的生存期绑定,因此您可能需要复制它。
编辑2:正如@David所建议的,复制意味着复制内容,而不是指针本身。有几种方法可以做到这一点。您可以手动执行(从C"继承"的传统方式)——这是通过std::strcpy
等函数完成的。这种方式相当复杂,因为它涉及手动资源管理,而这通常是不鼓励的,因为它会导致更复杂、更容易出错的代码。或者您可以使用智能指针或容器:它可以是std::vector<char>
或std::unique_ptr
/std::shared_ptr
。
我个人会选择第二条路。看看对此的讨论和@Oli的回答,这可能很有用。
如果您想将数据放入char
缓冲区,为什么不立即放入呢?这里有一个流类,它接受一个数组,确定它的大小,用null字符填充它(主要是为了确保生成的字符串以null结尾),然后设置一个std::ostream
直接写入这个缓冲区。
#include <iostream>
#include <algorithm>
struct membuf: public std::streambuf {
template <size_t Size> membuf(char (&array)[Size]) {
this->setp(array, array + Size - 1);
std::fill_n(array, Size, 0);
}
};
struct omemstream: virtual membuf, std::ostream {
template <size_t Size> omemstream(char (&array)[Size]):
membuf(array),
std::ostream(this)
{
}
};
int main() {
char array[20];
omemstream out(array);
out << "hello, world";
std::cout << "the buffer contains '" << array << "'n";
}
显然,这个流缓冲区和流可能存在于一个合适的命名空间中,并将在某个头中实现(将其中的任何内容放入C++文件中都没有多大意义,因为所有函数都是需要实例化的模板)。您也可以使用[已弃用]类std::ostrstream
来执行类似的操作,但创建自定义流非常容易,可能不值得麻烦。
如果您想要字符串的实际副本(如果字符串流对象在某个时刻将超出范围,则至关重要),则可以执行此操作:
const char *p = new char[ss.str().size()+1];
strcpy(p, ss.str().c_str());
...
delete [] p;
正如下面的评论中所讨论的,您应该小心这样做(手动内存管理很容易出错,而且非常不习惯C++)。为什么要使用原始字符数组?
我想明白了。使用命名空间std并将tstingstream
替换为stringstream
。下一步是:stringstream strstream;
strstream.imbue(std::locale("C"));
string str = strstream.str();
const char *sql= str .c_str();
现在您可以执行sql语句了。
sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
也许这对某人有帮助。