栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++:stringstream格式化字符串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++:stringstream格式化字符串

C语言通过snprintf对字符串进行格式化,格式化前需要首先对字符串的长度预估,如果长度大于了字符数组的大小,格式化字符串会被截断。

C++通过stringstream对字符串进行格式化:

#include 
#include 
#include 
using namespace std;

int main()
{
    stringstream sstream;

    sstream << "hello, ";        //格式化字符串,输入"hello, "
    sstream << 88;               //格式化字符串,输入88
    string&& str = sstream.str();//通过str获得sstream中当前内容
    cout << str << endl;         //输出:hello, 88
    return 0;
}

可以设置字符串的格式:

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    stringstream sstream;
    sstream << hex << setw(4) << setfill('0') << 15;    //设置为16进制,4个字符宽,补0
    string&& str = sstream.str();
    cout << str << endl;                                //输出:000f
    return 0;
}

需要注意的是stringstream的两个成员函数:str()及clear()的使用方法:

string str() const:返回stringstream对象当前内容的string对象:

stringstream sstream;
sstream << "hi";                //将字符串"hi"写入sstream
string&& str = sstream.str();   //获取sstream的内容保存在str中
cout << str << endl;            //输出:hi

void str (const string& s):通过参数s设置stringstream对象的内容

#include 
#include 
#include 
using namespace std;

int main()
{
    stringstream sstream;
    sstream.str("hello world");    //设置sstream的内容
    string&& str1 = sstream.str();
    cout << str1 << endl;          //输出:hello world

    sstream<<"hi";                 //向sstream写入字符串
    string&& str2 = sstream.str(); 
    cout << str2 << endl;          //输出:hillo world

    sstream.str("Goobye world");   //设置sstream的内容
    string&& str3 = sstream.str();
    cout << str3 << endl;          //输出:Goobye world
    return 0;
}


可见通过str可以设置stringstream的内容。
但是需要注意的是:虽然设置了内容,但是<<操作符还是从头开始向stringstream写入,
因此str2的前两个字符被<<操作符覆盖,因此其内容变为:hillo world

clear():当通过>>操作符将stringstream的内容转换其他的类型后,stringstream对象被设置了eof标志,此时如果不通过clear()将其清除(只会清除eof标志,不会改变stringstream的内容),就不能再次通过<<操作符将其他数据写入stringstream对象:

#include 
#include 
#include 
using namespace std;

int main()
{
    stringstream sstream;
    sstream << "hello";     //通过<<写入数据
    string str;
    sstream >> str;         //通过>>操作符将内容写入str
    cout << str << endl;    //输出:hello

    sstream.clear();        //清除eof标志
    sstream << 88;          //再次通过<<写入数据
    int data = 0;
    sstream >> data;        //通过>>操作符将内容写入data
    cout << data << endl;   //输出:88
    cout << sstream.str() << endl;    //输出:hello88
    return 0;
}

此例中因为通过>>已将数据写出,如果不调用clear操作,将无法再次通过<<写入数据。事实上,写出操作符>>完成后,会设置eof标志用于记录写出位置,通过clear将eof清除后,再次写入数据并再次写出时,会从上次标记eof的位置开始写出直到当前的eof或者换行/空格等分隔符所在的位置。

可以发现虽然clear后可以再次写入数据,但之前的数据依然存在;只是在写出的时候,已经写出的数据不会再次被写出。

如果要频繁的对stringstream对象写入写出,推荐每次clear后通过str("")将其内容也清空,以节省内存空闲

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号