如何将stringstream内容放入char而不是字符串类型?

时间:2012-01-06 22:56:26

标签: c++

每个人都知道stringstream.str()需要一个字符串变量类型来将stringstream.str()的内容存储到其中。

我想将stringstream.str()的内容存储到char变量或char数组或指针中。

有可能吗?

请用你的答案写一个简单的例子。

4 个答案:

答案 0 :(得分:12)

为什么不

std::string s = stringstream.str();
const char* p = s.c_str();

编辑:请注意,您无法在函数外自由地提供p:其生命周期与s的生命周期绑定,因此您可能需要复制它。

编辑2:正如@David建议的那样,上面的 copy 意味着复制内容,而不是指针本身。有几种方法可以做到这一点。您可以手动执行此操作(从C继承“遗留”) - 这是通过std::strcpy等功能完成的。这种方式非常复杂,因为它涉及手动资源管理,这通常是不鼓励的,因为它会导致更复杂和容易出错的代码。或者您可以使用智能指针或容器:它可以是std::vector<char>std::unique_ptr / std::shared_ptr

我个人会选择第二种方式。请参阅讨论和@Oli的答案,它可能很有用。

答案 1 :(得分:6)

如果您想将数据放入char缓冲区,为什么不立即将其放在那里?这是一个流类,它接受一个数组,确定它的大小,用空字符填充它(主要是为了确保结果字符串为空终止),然后设置std::ostream直接写入这个缓冲区。 / p>

#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 ++文件中没有太大意义,因为所有函数都是需要实例化的模板) 。您也可以使用[deprecated]类std::ostrstream来做类似的事情,但创建一个可能不值得打扰的自定义流非常容易。

答案 2 :(得分:1)

如果你想要一个字符串的实际副本,你可以这样做(如果stringstream对象在某些时候超出范围,则至关重要):

const char *p = new char[ss.str().size()+1];
strcpy(p, ss.str().c_str());

...

delete [] p;

正如下面的评论中所讨论的,你应该警惕这样做(手动内存管理容易出错,非常非惯用的C ++)。为什么你想要一个原始字符数组?

答案 3 :(得分:0)

我知道了。使用命名空间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);

也许对某人有帮助。