stringstream vs sprintf, sscanf.

开端

以前一直认为 stringstream 远不如 sprintf.

近日突然萌发了看看 stirngstream 是不是真的如我想的那么烂

正文

咱们来看看对比.

// stringstream.

stringstream sstream;
sstream << 1 << "abcc";
string str = sstream.str();  // 数字, 字符串混合.sstream << "123";        sstream >> num;          // 字符串转数字.

// sprintf.

string str(512, 0);
sprintf(&str[0], "%s%d", s, d);

sprintf(&str[0], "%[^a-z]%*[a-z]%[^a-z]%*[a-z]%[^\0]", "2014-asddsaqwfdsf6-qweljkhdkjfhs29");

// sscanf.

sscanf("123", "%d", &num);

从以上代码个来做比较.

stringstream:

提供了 数字, 字符串 互相转换功能.

完美支持string, 不需要提前知道 缓冲大小.

sprintf, sscanf.

需要提前设置缓冲大小, 比前者弱一点.

支持相当有限但非常强力的正则表达式, 完爆前者.

看到这, 聪明的你是不是已经猜到结果了呢.

逆袭

事实上, stringstream 相当强大, 只是你不知道...

咱们看看接下来的例子.

template<class T1, class T2>inline T1 parseTo(const T2 t){    static stringstream sstream;    T1 r;    sstream << t;    sstream >> r;    sstream.clear();    return r;}

int i = parseTo<int>("123");
float f = parseTo<float>("1.23");
string str = parseTo<string>(123);

有没有发现, 这种写法既方便又优美.

stringstream 真正强大的地方还在后面..

class date {
public:
   int year;
   int month;
    int day;
};

stringstream &operator<<(stringstream &sstream, const date &d)
{
    sstream << d.year << d.month << d.day;
}

stringstream &operator>>(stringstream &sstream, date &d)
{
    sstream >> d.year >> d.month >> d.day;
    return sstream;
}

stringstream是可扩展的.

通过C++的重载运算符, 任何自定义类都可以通过stringstream转换.

再来看一段...

sstream << "2014";sstream << "asddsaqwfdsf6qweljkhdkjfhs29"; 
string str = regex_replace(sstream.str(), "[a-zA-Z]+", "-");

又举了一个不恰当的例子.

此时 str == "2014-6-29";

自己封装下, stringstream可以支持完整的正则表达式...

完爆sprintf, sscanf....

stringstream vs sprintf, sscanf.

时间: 2024-11-25 19:41:58

stringstream vs sprintf, sscanf.的相关文章

c++拼接字符串效率比较(+=、append、stringstream、sprintf)

转自:http://www.cnblogs.com/james6176/p/3222671.html c++拼接字符串效率比较(+=.append.stringstream.sprintf) 最近写的程序用到大量拼接字符串,为了提高拼接效率,比较了一下+=.append.stringstream.sprintf四种拼接字符串的方法. 测试方法 比较方法是写了4个函数,分别用+=.append.stringstream.sprintf的方式来拼接字符串,拼接方法是将 s1="abcedfg&quo

字符串的处理常用sprintf

这道题目关于字符串的题目,当时在处理保留小数点后2位卡住了,在c++中 cout <<setprecision(2) <<std::fixed <<x <<endl; 我想用stringstream stream 进行保存,然后...其实在c中用sprintf(out,"%s %.2f",name,avg); 第二个教训要看好题目 对数据转换问题上 用sprintf sscanf好处理 float sum(int score[],int

stringstream字符串流

例题详解 題目:输入的第一行有一个数字 N 代表接下來有 N 行資料,每一行資料里有不固定個數的整數(最多 20 個,每行最大 200 個字元),請你寫一個程式將每行的总和印出來. 輸入: 3 1 2 3 20 17 23 54 77 60 111 222 333 444 555 666 777 888 999 輸出: 6 251 4995 代码: 1 #include<iostream> 2 #include<sstream> 3 #include<algorithm>

istringstream字符串流,实现类似字符串截取的功能,字符串流中的put,str()将流转换成为字符串string

 1. istringstream字符串流 #include <iostream> #include <sstream> #include <string> using namespace std; struct MyStruct { string str1, str2, str3; double db; int num; char ch; }; void main() { string  mystring("china  google microsoft

【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级

文件重定向 #include<iostream> using namespace std; void main() { char str[30] = { 0 }; cin >> str; cout << str; system(str); cerr << "error for you"; cin.get(); cin.get(); } 键盘输入流 #include<iostream> #include <stdlib.h

ANSI C 文件 IO 管理

打开/关闭文件 fopen() fclose() printf() 返回:输出的信息字节数 scanf() fprintf() fscanf() sprintf() sscanf()

linux常用C函数目录

字符测试篇 isalnum isalpha isascii iscntrl isdigit isgraphis islower isprint isspace ispunct isupper isxdigit 字符串转换篇 atof atoi atol gcvt strtod strtol strtoul toascii tolower toupper 内存控制篇 calloc free getpagesize malloc mmap munmap 日期时间篇 asctime ctime get

PHP的学习--可变函数

PHP 支持可变函数的概念.这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它.可变函数可以用来实现包括回调函数,函数表在内的一些用途. 可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构.需要使用自己的包装函数来将这些结构用作可变函数. Example #1 可变函数示例 <?php function foo() { echo "In foo()<br /&

Convert integer to string(int类型转化为string类型)

译: 这是一个常见的问题,但是对于这个问题我没有找到一个很好的方法:如何将整数类型转化为字符串类型?我遇到过几种解决方案.我不会使用stringstream.sprintf()函数也遇到了问题,并且它是C语言的风格.函数itoa()以前工作地很好,但参考文档说: 这个函数在ANSI-C中没有被定义,并且它不是C++的一部分,但有些编译器支持 并且这个函数也是C语言风格. 我自己写了一个C++风格的函数,并且它工作起来没有错误(译者注:我不这么认为,详见后文). string convertInt