在C / C ++中,字符串以NULL结尾。
我可以将stringstream
用作C#中的MemoryStream
内存流吗?
内存流数据在数据中间可能有\0
个值,但C ++字符串以NULL结尾。
答案 0 :(得分:8)
在std::string
中存储字符序列时,您可以包含空字符。相应地,std::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
}
答案 1 :(得分:5)
在C / C ++中,字符串以NULL结尾。
每种语言都有自己的字符串功能。
我可以在C#中使用stringstream作为MemoryStream等内存流吗?
不确定。内存流是由内存(而不是文件)支持的流。这正是std :: stringstream的意思。界面存在一些差异,但这些差异较小,使用文档应该可以轻松解决任何混淆。
内存流数据在数据中间可能有\ 0值,但C ++字符串以NULL结尾。
这是完全错误的。
答案 2 :(得分:1)
C和C ++是两种不同的语言,C序列中的连续字符表示字符串,您可以使用memcpy()
,memset()
将其视为可以设置/获取其值的内存部分, memcmp()
。
在C ++中,字符串表示用于将正确数据作为字符串获取的一类信息。因此,您无法将其视为具有char
类型的内存位置序列。