C++标准库中sstream与strstream的区别详细解析_C 语言

在C++有两种字符串流,一种在sstream中定义,另一种在strstream中定义。它们实现的东西基本一样。

strstream里包含
class strstreambuf;
class istrstream;
class ostrstream;
class strstream;
它们是基于C类型字符串char*编写的

sstream中包含
class istringstream;
class ostringstream;
class stringbuf;
class stringstream;
class …….
它们是基于std::string编写的

因此ostrstream::str()返回的是char*类型的字符串
而ostringstream::str()返回的是std::string类型的字符串

在使用的时候要注意到二者的区别,一般情况下推荐使用std::string类型的字符串
当然如果为了保持和C的兼容,使用strstream也是不错的选择

时间: 2024-08-03 10:45:08

C++标准库中sstream与strstream的区别详细解析_C 语言的相关文章

C++中overload,override,overwrite的区别详细解析_C 语言

Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载.(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字. Overwrite(重写):是指派生类的函数屏蔽了与其同名的

C++中继承与组合的区别详细解析_C 语言

C++的"继承"特性可以提高程序的可复用性.正因为"继承"太有用.太容易用,才要防止乱用"继承".我们要给"继承"立一些使用规则: 一.如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能. 不要觉得"不吃白不吃",让一个好端端的健壮青年无缘无故地吃人参补身体. 二.如果类B 有必要使用A 的功能,则要分两种情况考虑: (1)若在逻辑上B 是A 的"一种"(a

c++中#include <>与#include""的区别详细解析_C 语言

首先是区别: <>先去系统目录中找头文件,如果没有在到当前目录下找.所以像标准的头文件 stdio.h.stdlib.h等用这个方法. 而""首先在当前目录下寻找,如果找不到,再到系统目录中寻找. 这个用于include自定义的头文件,让系统优先使用当前目录中定义的. 然后是使用习惯的问题: 假设A是常被包含的文件. 则A中写的应该是一些 常用的函数,和一些宏定义.而且,不能出现main函数.

c++中new的三种用法详细解析_C 语言

一. 简介new有三种使用方式:plain new,nothrow new和placement new. (1)plain new顾名思义就是普通的new,就是我们惯常使用的new.在C++中是这样定义的:    void* operator new(std::size_t) throw(std::bad_alloc);    void operator delete(void *) throw(); 提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NU

全局变量与局部变量在内存中的区别详细解析_C 语言

一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量

C++中队列的建立与操作详细解析_C 语言

什么是队列结构 队列结构是从数据运算来分类的,也就是说队列结构具有特殊的运算规则.而从数据的逻辑结构来看,队列结构其实就是一种线性结构.如果从数据的存储结构来进一步划分,队列结构可以分成两类. 顺序队列结构:即使用一组地址连续的内存单元依次保存队列中的数据.在程序中,可以定义一个指定大小的结构数组来作为队列. 链式队列结构:即使用链表形式保存队列中各元素的值. 在队列结构中允许对两端进行操作,但是两端的操作不同.在表的一端只能进行删除操作,称为队头:在表的另一端只能进行插入操作,称为队尾.如果队

C++中delete和delete[]的区别详细介绍_C 语言

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. 复制代码 代码如下: #include <iostream>; us

成员初始化列表与构造函数体中的区别详细解析_C 语言

论坛中回答一个别人问题 C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的.不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值. 请问这里的初始化数据成员与对数据成员赋值的含义是什么?有什么区别? 我知道在数据成员有默认构造函数时是有不同的,但对其他类型的成员呢?其他类型成员的初始化和赋值有区别吗?================

C标准库&amp;lt;assert.h&amp;gt;的实现详解_C 语言

本文实例讲解了C标准库<assert.h>的实现过程及相关用法.分享给大家供大家参考.具体分析如下: 一.背景知识 头文件<assert.h>唯一的目的就是提供assert宏定义,可以在程序中关键的地方使用这个宏来进行断言.如果一处断言被证明非真,希望程序在标准错误流输出一条适当的提示信息,并使执行异常终止. 可以这样写代码: #include<assert.h> ... assert(0 <= i && i < sizeof(a) / si