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("")将其内容也清空,以节省内存空闲



