string和stringstream

今天在算法书上看了一道题,里面有个处理字符串的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主要有两个功能:切割字符串及数据类型的转换 .

未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值