注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

[原]C++字符串操作总结  

2013-03-29 11:38:21|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


C++标准库<sstream>中提供了一系列的模板类用来对字符串流的输入、输出和输入\输出操作,这些操作都是基于C++的string类,即它们都是输入、输出到一个string对象,当然它们也都提供了对应的宽字符集操作的版本。

在C++开发过程中通常使用sstream对字符串进行操作,这里还存在sstream的一个兄弟版本strstream,它也可以提供类似功能的字符串操作。

区别:sstream与strstream,

(1)这两者实现了相似的功能;

(2)sstream是目前常用C++字符串操作函数,其操作是基于std::string类,例如它的str()函数返回的是std::string类型的字符串;而strstream是兼容C的,它的操作基于C类型的char*,例如它的str()函数返回的是char*表示的字符串。

(3)strstream已经被C++标准宣布为“deprecated”不再提倡使用了。Msdn中是这么评价二者的:Objects of type char * can use the functionality in <strstream> for streaming.However, <strstream> is deprecated and theuse of <sstream> is encouraged.

(4)在C++开发中尽量使用sstream,如果要兼容c则可以考虑选择strstream

另:C语言的字符串操作主要有C的标准库<string.h>来完成,该库中主要通过一系列基于char*的函数,例如strcpy之类完成对字符串的常见操作。

 

sstream中包括ostringstream类、istringstream类和stringstream类,

sstream中各模板的构造函数如下所示:

  #include<sstream>

  stringstream()

  stringstream(openmode mode )

  stringstream(string s, openmode mode )

  ostringstream()

  ostringstream(openmode mode )

  ostringstream(string s, openmode mode )

  istringstream()

  istringstream(openmode mode )

  istringstream(string s, openmode mode )

 

ostringstream类

ostringstream类用于输出到一个字符串,就像C中的sprintf可以把一系列的值输入到一个char*的buffer中一样。

对于sprintf,你可以这么使用:

 

 char buf[256];
  int i = 22;
  sprint(buf, "the value is %d" , i);

这样就可以将整形数字i与字符串” the value is”组合后放在buf中。


 

对于ostringstream类,则可按照如下的方式进行工作:

 ostringstream s1;
  int i = 22;
  s1 << "the value is " << i << endl;
  string s2 = s1.str();
  cout << s2;

 

istringstream类主要用于从一个string对象中读取内容,它就像c语言中的sscanf一样。例如:

 istringstream stream1;
  string string1 = "25";
  stream1.str(string1);//也可用构造函数istringstream stream1("25");
  int i;
  stream1 >> i;
  cout << i << endl;  // displays 25

因此可以借助sstream中的这些类进行数值与字符串之间的转换。

 

sstrem库中重载了”>>”和”<<”操作符

其中”>>”用于将字符串流中的数据输出到一个对象中,例如上面的代码中可以将字符串格式保存的整形数字输出到一个整形变量中,也即自动完成字符串转换到对应的整形类型;操作符”<<”主要向流中插入一个对象,例如上面的代码中可以将一个整形和浮点型的数字直接插入到字符串流中,也即自动完成数值到string类的转换。

 

sstream库中还提供了函数rdbuf,主要用于返回一个指向当前字符串流的缓冲区的指针。

  #include <sstream>
  stringbuf* rdbuf();

 

sstream库中提供了str函数

  #include <sstream>
  void str( string s );
  string str();

该函数主要有下面几种用途:

1、获取一个字符串流的string拷贝,即把字符串流中的字符串复制到一个string对象中,主要用于流的输出,例如:

 ostringstream stream1;
  stream1 << "Testing!" << endl;
  cout << stream1.str();

2、将一个字符串拷贝到字符串流中,例如:
istringstream stream1;
  string string1 = "25";
  stream1.str(string1)


 3、与clear结合使用,用于清空一个字符串流,让它能够再次被使用:

istringstream stream1;
  float num;
  string string1 = "11\n22.2\n33.3 356***256";
  stream1.str(string1);
  while( stream1 >> num ) cout << "num: " << num << endl; 
  //stream1.clear();//注释掉clear,
cout << "-------------" << endl;
  string string2 = "1 2 3 4 5  6 7 8 9 10";
  stream1.str(string2);
  while( stream1 >> num ) cout << "num: " << num << endl;  


将会如下出:

Num:11

Num:22.22

Num:33.3

Num:356

-------------

可以看到:

(1)356之后的***256没有被输出,所以在使用sstream库中的类对数字形式的字符串分割和转换的时候,是遇到空格、回车就会分割数字,但是遇到非数字的字符,则直接终止,后面的将不再进行继续解析。

(2)对于上面的代码,如果加上stream1.clear(),下面输出的1-9数字就可以顺利输出。因此,如果重复使用一个字符串的时候,一定加上stream1.clear()

3)特别注意:单独使用clear()函数无法清空一个字符串流,如果要清空可以使用字符串流的str函数,让其参数为空,即str(“”)

例如:下面的代码:

stringstreamsstr;

sstr<<”hello”;

sstr.clear();

sstr<<”world”;

cout<<sstr.str();

将会输出:

helloworld

而不会只输出:

World

 

此时,如果要清空已使用过的字符串流则需如下形式写即可:

stringstreamsstr;

sstr<<”hello”;

sstr.clear();

sstr.str();

sstr<<”world”;

cout<<sstr.str();

甚至可以不用clear,按照如下方式写也可清空:

stringstreamsstr;

sstr<<”hello”;

sstr.str();

sstr<<”world”;

cout<<sstr.str();

 

因此,需要留心的是:clear函数并不是一个名副其实的清空函数,它只是重置了流的标志位而已,并未清空字符串流。

使用:sstr.str();才真正让字符串流中的以前的内容清空。

 

  评论这张
 
阅读(830)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018