今天在算法书上看了一道题,里面有个处理字符串的stringstream的用法感觉很神奇很方便,但就是不会用,哈哈,所以总结了一下string和stringstream的用法。
- string:使用string需要头文件#include<string>,string抽象的来说是c++中的字符串,取代了c中的字符串数组。实际上string是一个类, 里面有很多处理字符串的成员函数。
#include<iostream>
#include<string>
using namespace std;
int main () {
string str1, str2;
getline(cin,str1);
getline(cin,str2);
cout<<str1+str2<<endl; #string内重载了+,用于连接字符串
cout<<str1.size()<<" "<<str1.length()<<endl; #size和length返回字符串的长度
if (str1!=str2) #重载!=和==,判断是否相等
{
cout<<"str1=!str2";
}
}
运行结果:
c++
hello!
c++ hello!
str1=!str2
主要介绍string中和find有关的函数:
find函数返回的类型是string::size_type,返回的好像是unsigned int,不知道有什么区别;如果find函数找不到该字符串,则返回一个str.npos,这个值好像和平台有关,可以用来判断是否有该字符串,具体的值不需要知道,我这显示的是18446744073709551615。
#include<iostream>
#include<string>
using namespace std;
int main () {
string str="zhongguoren";
cout<<str.find("g")<<" "<<str.rfind("r")<<endl; #rfind是从后往前找“r”
string::size_type position=str.find("g");
if(position==str.npos)
cout<<"该字符不存在"<<endl;
else
cout<<"position:"<<position<<endl;
cout<<str.npos; #.nops在不同平台上之不一样
}
运行结果:
4 8
position:4
18446744073709551615
问题:如何找出某个字符串中制定字符的所有位置?
#include<iostream>
#include<string>
using namespace std;
int main ()
{
string a="ahnfgrhvbjdhguiteb";
int i=1,position=0;
while((position=a.find("h",position))!=a.npos) #find("h",position)从下标为position的位置找
{
cout<<"position"<<i<<":"<<position<<endl;
i++;
position++;
}
}
运行结果:
position1:1
position2:6
position3:11
注意:find和rfind这两个函数如果形参接收一个字符串,例如find("abc")或 rfind("abc")时,字符串必须有连续的abc三个字母才行。
- stringstream
stringstream时c++里面字符串输入输出流,需要用到头文件#include<sstream>
先来看两道题,stringstream的主要用法正是这两道题中的用法:
复数乘积:
输入:1+2i
3+4i
输出:-5+10i
即以字符串的形式输入两个复数,并以同样的方式输出乘积。
#include <sstream>
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
class Solution {
public:
string complexNumberMultiply(string a, string b) {
int ra, ia, rb, ib;
char buff;
stringstream aa(a), bb(b), ans;
aa >> ra >> buff >> ia >> buff;//拆分
bb >> rb >> buff >> ib >> buff;
ans << ra*rb - ia*ib << "+" << ra*ib + rb*ia << "i";//组合
return ans.str();
}
};
Solution s;
string a,b;
getline(cin,a);getline(cin,b);
cout<<s.complexNumberMultiply(a,b);
}
运行结果:
1+2i
3+4i
-5+10i
输入数据的每行包含若干个(至少一个)以空格隔开的整数,输出每行中所有整数之和
#include<string>
#include<sstream>
using namespace std;
int main () {
string line;
getline(cin,line);
int sum=0,x;
stringstream str(line);
while(str>>x) {
sum=sum+x;
}
cout<<sum<<endl;
}
运行结果:
1 2 3
6
stringstream主要有两个功能:切割字符串及数据类型的转换 .
未完待续......