9

在 C/C++ 中,字符串以 NULL 结尾。

我可以stringstreamMemoryStream在 C# 中那样用作内存流吗?

内存流的数据可能\0在数据中间有值,但 C++ 字符串以 NULL 结尾。

4

3 回答 3

8

在 a 中存储字符序列时,std::string您可以包含空字符。相应地, astd::stringstream也可以处理嵌入的空字符。但是,流上的各种格式化操作不会通过空字符。此外,当使用内置字符串将值分配给std::string空字符时,这很重要,即,您需要使用各种重载,将字符序列的大小作为参数。

你到底想达到什么目的?可能有比在字符串流中旅行更简单的方法。例如,如果您想读取流接口以与内存缓冲区进行交互,那么自定义流缓冲区真的很容易编写和设置:

struct membuf
    : std::streambuf 
{
        membuf(char* base, std::size_t size) {
        this->setp(base, base + size);
        this->setg(base, base, base + size);
    }
    std::size_t written() const { return this->pptr() - this->pbase(); }
    std::size_t read() const    { return this->gptr() - this->eback(); }
};

int main() {
    // obtain a buffer starting at base with size size
    membuf       sbuf(base, size);
    std::ostream out(&sbuf);
    out.write("1\08\09\0", 6); // write three digits and three null chars
}
于 2012-11-24T16:16:08.250 回答
5

在 C/C++ 中,字符串以 NULL 结尾。

  • 两种完全不同的语言(在语法上有一些共同点)。但是 C 与 C++ 的接近程度与 Jave 与 C# 的接近程度一样(因为它们是不同的)。

每种语言都有自己的字符串特征。

  • C 使用一个字节序列,按照惯例以 '\0' 字节终止。
    • 通常称为 C 字符串。
    • 这个内存区域没有什么特别之处,它只是一个字节序列。
    • 没有强制执行约定,也没有标准的构建方式。
    • 这是 C 程序中存在大量错误的地方。
  • C++ 使用一个类(带有方法)std::string。

我可以使用 stringstream 作为 C# 中的 MemoryStream 之类的内存流吗?

当然。内存流是由内存(而不是文件)支持的流。这正是 std::stringstream 是什么。界面有一些差异,但这些差异很小,使用文档应该很容易解决任何混淆。

内存流的数据可能在数据中间有 \0 值,但 C++ 字符串以 NULL 结尾。

这是完全不正确的。

  • C-String 以 '\0' 结尾。
  • C++ std::string 不是空终止的,可以包含任何字符
于 2012-11-24T17:39:22.133 回答
1

C 和 C++ 是两种不同的语言,在 C 中连续字符的序列表示字符串,您可以将其视为可以设置/获取其值的内存部分,使用memcpy(), memset(), memcmp().

在 C++ 中,字符串是指用于获取正确数据的一类信息作为字符串。因此,您不能将其视为具有char类型的内存位置序列。

于 2012-11-24T15:22:06.443 回答