一、string

string 是 C++ 提供的字符串类型,和 C 的字串相比,除了有不限长度的优点外,还有其他许多方便的功能。要使用 string, 必须先加入这一行:

#include <string>

接下來要定义一个字串变量,可以写成:

string s;

我们也可以在定义的同时初始化字串:

string s = "you";

而要取得其中某一个字元,和传统C 的字串一样是用 s[i] 的方式取得。比较不一样的是如果 s 有三个字元,传統 C 的字串的 s[3] 是'\0' 字符,但是 C++ 的 string 则是只到 s[2] 这个字符而已。

做一个对照:

操作 string 字符数组
定义字符串 string s; char s[100];
取得第i个字符 s[i] s[i]
字符串长度 s.length()
或 s.size()
strlen(s)
读入一行 getline(cin, s); gets(s);
赋值 s = "you"; strcpy(s, "you");
字符串连接 s = s + "you";
s += "you";
strcat(s, "you");
字符串比较 s == "you" strcmp(s, "you");

两个string常用的方法是find和substr。在下面的代码当中:find函数从str的第3个位置查起,找到ssdf这个子串后,返回子串的位置。而substr函数从pos位置开始,截取5个字符,赋值给str2。也就是说,str2之后的内容将是ssdfs。

string str = "aaaaddddssdfsasdf";
size_t pos = str.find("ssdf", 3);
//可以用if(pos == string::npos) 用来判断是否找到子串。
//传送门: http://blog.csdn.net/sunshineacm/article/details/78075135
string str2 = str.substr(pos, 5);

二、stringstream

stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream、fstream有类似的操作方式。要使用stringstream, 必须先加入这一行:

#include <sstream>

stringstream主要是用在將一个字符串分割,可以先用.clear( )以及.str( )將指定字串设定成一开始的內容,再用>>把个別的资料输出。

举个例子:

題目:输入的第一行有一个数字 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

代码:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;int main()
{string s;stringstream ss;int n;cin >> n;getline(cin, s);  //读取换行for (int i = 0; i < n; i++){getline(cin, s);ss.clear();ss.str(s);int sum = 0;while (1){int a;ss >> a;if(ss.fail())break;sum += a;}cout << sum << endl;}return 0;
}

三、使用stringstream简化类型转换

C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。接下来,我将举例说明怎样使用这些库来实现安全和自动的类型转换。

一个例子:

#include <stdio.h>int main()
{int n = 10000;char s[10];sprintf(s, "%d", n);//s中的内容为“10000”//到目前为止看起来还不错。但是,对上面代码的一个微小的改变就会使程序发生错误printf("%s\n", s);sprintf(s, "%f", n);//错误的格式化符printf("%s\n", s);return 0;
}

输出:

在这种情况下,由于错误地使用了 %f 格式化符来替代了%d。因此,s在调用完sprintf()后包含了一个不确定的字符串。要是能自动推导出正确的类型,那不是更好吗?

进入stringstream:

由于ns的类型在编译期就确定了,所以编译器拥有足够的信息来判断需要哪些转换。<sstream>库中声明的标准类就利用了这一点,自动选择所必需的转换。而且,转换结果保存在stringstream对象的内部缓冲中。你不必担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。

<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。

注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

1、string到int的转换

string result = "10000";
int n = 0;
stream << result;
stream >> n;  //n等于10000 


2.重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住在每次转换前要使用clear()方法。

在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。


3.在类型转换中使用模板

你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝。

template<class T>  void to_string(string &result, const T &t)
{  ostringstream oss;  //创建一个流  oss << t;  //把值传递入流中  result = oss.str();  //获取转换后的字符并将其写入result
}  //这样,你就可以轻松地将多种数值转换成字符串了
to_string(s1, 10.5);  //double到string
to_string(s2, 123);  //int到string
to_string(s3, true);  //bool到string  //可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:  template<class out_type, class in_value>  out_type convert(const in_value & t)
{  stringstream stream;  stream << t;  //向流中传值  out_type result;  //这里存储转换结果  stream >> result;  //向result中写入值  return result;
}  

测试代码:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;template<class T>
void to_string(string &result, const T &t)
{ostringstream oss;oss << t;result = oss.str();
}template<class out_type, class in_value>
out_type convert(const in_value & t)
{stringstream stream;stream << t;out_type result;stream >> result;return result;
}int main()
{//to_string实例string s1, s2, s3;to_string(s1, 10.5);  //double到stringto_string(s2, 123);  //int到stringto_string(s3, true);  //bool到stringcout << s1 << endl << s2 << endl << s3 << endl << endl;//convert()例子double d;string salary;string s = "12.56";d = convert <double> (s);  //d等于12.56salary = convert <string> (9000.0); //salary等于"9000"cout << d << endl << salary << endl;return 0;
}

输出:

4.结论

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样的特性,使我们有充足得理由去使用<sstream>。<sstream>库还提供了另外一个特性—可扩展性。你可以通过重载来支持自定义类型间的转换。

5.一些实例

stringstream通常是用来做数据转换的。相比c库的转换,它更加安全,自动和直接。

例子一: 基本数据类型转换例子 int 转 string

#include <iostream>
#include <string>
#include <sstream>
using namespace std;int main()
{stringstream ss;string s;int i = 1000;ss << i;ss >> s;cout << s << endl;return 0;
}

运行结果:



例子二: 除了基本类型的转换,也支持char *的转换

#include <iostream>
#include <string>
#include <sstream>
using namespace std;int main()
{stringstream ss;char s[10];ss << 8888;ss >> s;cout << s << endl;return 0;
}

运行结果:



例子三: 再进行多次转换的时候,必须调用stringstream的成员函数.clear()

#include <iostream>
#include <string>
#include <sstream>
using namespace std;int main()
{stringstream ss;int first = 0, second = 0;ss << "456";  // 插入字符串ss >> first;  //转换成intcout << first << endl;ss.clear();  //在进行多次转换前, 必须清除ssss << true;ss >> second;cout << second << endl;return 0;
}

运行结果:

运行.clear()结果


没有运行.clear()结果



6.使用误区

如果stringstream使用不当,当心内存出问题。试试下面的代码,运行程序前打开任务管理器,看看内存变化。

复制代码,把 stream.str("");  那一行的注释去掉,再运行程序,内存就正常了。

看来stringstream似乎不打算主动释放内存( 或许是为了提高效率 ),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因此这时候,需要适时地清除一下缓冲 ( 用 stream.str("")  )。

另外不要企图用  stream.str().resize(0) 或  stream.str().clear()  来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果(做个实验就知道了,内存的消耗还在缓慢的增长)

#include <iostream>
#include <sstream>
using namespace std;int main()
{std::stringstream stream;string str;while(1){//clear()这个名字让很多人想当然地认为它会清除流的内容。//实际上它并不清空任何内容,它只是重置了流的状态标志。stream.clear();//去掉下面这行注释,清空stringstream的缓冲,每次循环内存消耗将不再增加。//stream.str("");stream << "you see see you";stream >> str;// 去掉下面这行注释,看看每次循环,你的内存消耗会增加多少//cout << "Size of stream = " << stream.str().length() << endl;}return 0;
}

参考链接:

http://blog.csdn.net/zhang_xueping/article/details/47846807

http://blog.csdn.net/u014097230/article/details/52089530

string和stringstream用法相关推荐

  1. string和stringstream用法总结

    string和stringstream用法总结 一.string string 是 C++ 提供的字串型態,和 C 的字串相比,除了有不限长度的优点外,还有其他许多方便的功能.要使用 string, ...

  2. 2013蓝桥杯C++A:颠倒的价牌(stringstream用法)

    四.题目:颠倒的价牌 Description 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店. 其标价都是4位数字(即千元不等). 小李为了标价清晰.方便,使用了预制的类似数码管的标价 ...

  3. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

  4. string的常见用法详解

    目录 string的定义 string中内容的访问 string常用函数实例解析 在C语言中,一般使用字符数组char str[]来存放字符串,但是使用字符数组有时会显得操作麻烦,而且容易因经验不足而 ...

  5. String.format() 方法用法解说

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. String chargeFlowUrl = _AGENT_URL+ "?agentAcc ...

  6. C++string类常用函数 c++中的string常用函数用法总结

    string类的构造函数: string(const char *s);    //用c字符串s初始化 string(int n,char c);     //用n个字符c初始化 此外,string类 ...

  7. String.matches()的用法

    String.matches()的用法 String.matches() 这个方法主要是返回是否匹配指定的字符串,如果匹配则为true,否则为false; 如:/** 判断字符创是否是一个有效的日期 ...

  8. C++中string::npos的用法总结

    C++中string::npos的用法总结 一.关于npos的定义 二.nops的常见用法 三.注意点 一.关于npos的定义 在cplusplus.com中有如下解释: static const s ...

  9. java中String的常见用法总结

    首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 以下是关于str ...

最新文章

  1. Monkey环境配置
  2. C++中const的用法
  3. Blender从头到尾创建一辆宝马轿车视频教程
  4. Tensorflow实现神经网络及实现多层神经网络进行时装分类
  5. block(六)循环引用-b
  6. 百度超级链XChain(12)平行链与群组
  7. boost::fusion::copy用法的测试程序
  8. 【设计】精致的侧滑菜单设计案例
  9. array_push_PHP array_push()函数与示例
  10. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API
  11. linux不显示无线网卡驱动安装失败,Linux_Ubuntu无线网卡驱动安装方法,安装了Ubuntu后发现没有无线网 - phpStudy...
  12. 人生小故事,看完后想十秒钟,你会获益匪浅
  13. 浏览器事件 - 监听浏览器刷新问题及解决方案
  14. SpringCloud狂神说学习笔记(一)
  15. python求小于n的最大素数_小于或等于n的素数
  16. awb入门(1).图像的色彩
  17. Kafka的消息模型
  18. idea java 语法高亮_Intellij IDEA 中JAVA常用配置项总结
  19. vultr连接不上ssh的解决方案
  20. 弹窗代码(详细说明)

热门文章

  1. 手把手教你用站长工具综查询网站域名在各个平台的权重情况 站长工具综查询
  2. 基于Matplotlib的五边形雷达图
  3. 【2019暑假集训】07.10比赛总结
  4. 手把手教MFC做计算器
  5. 智能车的转弯部分_周末,这群清华学子自己造智能车游“清华园”
  6. 校园网中锐捷客户端与VMware的NAT转换冲突问题解决
  7. ThinkInJava 中文版-下载
  8. 清空chrome浏览器缓存
  9. 梅沙系统根据什么计算机知识编制的,(岗位职责)“打基础强素质当尖兵”岗位练兵实施方案...
  10. KNN算法身高、体重、鞋号预测男女性别