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

Lio*_*ing 8 c++

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

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

有可能吗?

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

Vla*_*lad 12

为什么不呢

std::string s = stringstream.str();
const char* p = s.c_str();
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,您无法自由地向p外部提供您的功能:它的生命周期与生命周期相关s,因此您可能希望复制它.

编辑2:作为@大卫所暗示的,复制上述指内容,而不是指针本身的复制.有几种方法可以做到这一点.您可以手动执行此操作(从C继承"遗留") - 这可以通过以下函数完成std::strcpy.这种方式非常复杂,因为它涉及手动资源管理,这通常是不鼓励的,因为它会导致更复杂和容易出错的代码.或者您可以使用智能指针或容器:它可以是/ std::vector<char>或.std::unique_ptrstd::shared_ptr

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


Die*_*ühl 6

如果你想将数据放入char缓冲区,为什么不立即把它放在那里呢?这是一个流类,它接受一个数组,确定它的大小,用空字符填充它(主要是为了确保结果字符串为空终止),然后设置一个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";
}
Run Code Online (Sandbox Code Playgroud)

显然,这个流缓冲区和流可能存在于一个合适的命名空间中,并且会在某个头文件中实现(将它的任何内容放入C++文件中没有多大意义,因为所有函数都是需要实例化的模板).您也可以使用[deprecated]类std::ostrstream来做类似的事情,但是创建一个可能不值得打扰的自定义流非常容易.

  • 虽然这个答案在技术上是正确的,但它为新手提供了一个固定大小的缓冲区.IYAM,潜伏着缓冲区溢出的IME. (2认同)