C++string类总结(输入输出 查找 和各种修改字符串方法 代码实现容易理解)

C++string类总结

初始化|

string(size_type n,char c)创建一个包含n个元素的string对象,其中每个元素都初始化为c
string(const string &str)复制构造函数
string(const char *s,size_type n)将string初始化为s指向的前n个字符
string(Iter begin,Iter end)将string对象初始化为区间[begin,end)里面的字符
string()创建一个默认的string对象,长度为0
string(const char * s)将string对象初始化为s指向的字符串的最大长度
string(const string &str,string size_type pos=0,size_type n=npos)将一个string对象初始化为对象str从位置pos开始到结尾的字符,或从位置pos开始的n个字符
	string str1("jinnian shujia buac");//
	string str2(20, '$');//20个$
	string str3(str1);//str3=str1
	char str4[] = "mingnian shujia ac";
	string str5(str4, 10);//mingnian s  str4的前十个
	string str6(str4 + 4, str4 + 10);//nian s //str4的 下标0开始 [4,10)
	string str7(&str4[4], &str4[10]);
	string str8(str1, 2, 3);//nni  下标2开始三个
	string str9;
	str9=str1+str2;

下面是输出的结果

jinnian shujia buac
$$$$$$$$$$$$$$$$$$$$
jinnian shujia buac
mingnian shujia ac
mingnian s
nian s
nian s
nni
jinnian shujia buac$$$$$$$$$$$$$$$$$$$$

string类输入

对于c风格的字符串有三种输入方式`

char str[100];
cin>>str;//读取一个单词
cin.getline(str,100);//读取一行  遗弃换行符
cin.get(str,100);//读取一行  留下换行符

对于string对象,有两种方式

string str;
cin>>str;
getline(cin,str);//读取一行 遗弃换行符

第三个参数 可以用来确定输入的边界
我们用读取到s结束为例(读取到s的前一个字符,不会读取到s)

cin.getline(str,100,'s');
getline(cin,str,'s');

如果在输入队列中输入xixi hahasda
str=xixi haha;

长度

length()和size()都可以返回string的长度

length()成员来自较早版本的string类,而size()则是为提供STL兼容性
而添加的

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	string str,str1;
	str = "abcdefg";
	cout << str.size() << endl;
	cout << str.length() << endl;
	return 0;
}//输出结果为两个7

find方法的四个版本

string::pos 是字符串可存储的最大字符数,通常是无符号int或者无符号long的最大取值

原型: size_type find(const string &str,size_type pos=0)const;

find(const string &str,pos=0)const | 从字符串的pos位置开始,查找子字符串str。如果找到,则返回该字符串首次出现时首字母的索引;否则,返回string::pos

原型: size_type find(const char *s,size_type pos=0)const;

find(const string &str,pos=0)const | 从字符串的pos位置开始,查找子字符串s。如果找到,则返回该字符串首次出现时首字母的索引;否则,返回string::pos

原型: size_type find(const char *s,size_type pos=0,size_type n)const;

从字符串的pos位置开始,查找s的前n个字符组成的子字符串。如果找到,则返回该子字符串首次出现其首字母的索引;否则返回string::pos

原型:size_type find(char ch,size_type pos=0)const;

从字符串的pos位置开始,查找字符ch。如果找到,则返回该字符首次出现的位置;否则返回string::pos

上代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	string str,str1;
	str = "abcdefg";
	str1 = "cd";
	char str2[] = "cd";
	char str3[] = "dc";
	char ch = 'd';
	cout << str.find(str1, 0) << endl;//cd第一次出现的位置
	cout << str.find(str2, 0) << endl;//cd第一次出现的位置
	cout << str.find(str3, 0) << endl;//找不到
	cout << str.find(ch, 0) << endl;//e第一次出现的位置
	return 0;
}

输出结果为
2
2
4294967295
3

string库还提供了相关的方法:
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
重载方法和find()类似
rfind()

查找子字符串或字符最后一次出现的位置

find_first_of()

在字符串中查找参数中任何一个字符首次出现的位置

find_first_not_of()

在字符串中查找第一个不包含在参数中的字符

find_last_of()

在字符串中查找参数中任何一个字符最后一次出现的位置

find_last_not_of()

在字符串中查找最后一个不包含在参数中的字符

代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	string str,str1;
	str = "abcdba";
	cout << str.rfind('a') << endl;              //返回最后一个a的位置
	cout << str.find_first_of('a')<<endl;        //返回第一个a的位置
	cout << str.find_first_not_of("acb")<<endl;  //返回d的位置
	cout << str.find_last_of('b') << endl;       //返回第一个b的位置
	cout << str.find_last_not_of('a') << endl; //返回最后一个b的位置
	return 0;
}

输出:
5
0
3
4
4

比较方法和函数

string类提供了用于比较2个字符串的方法和函数,下面是方法的原型

int compare(const basic_string &str) const noexcept

int compare(size_type pos1,size_type n1,const basic_string &str) const

int compare(size_type pos1,size_type n1,const basic_string &str,size_type pos2,size_type n2) const
int compare(const charT* s)const
int compare(size_type pos1,size_type n1,const charT * s)const
int compare(size_type pos1,size_type n1,const charT* s,size_type n2)const;

如果第一个字符串位于第二个字符串之前,则第一个方法返回一个小于0的值,如果这两个字符串相同,则将返回0,如果第一个字符串位于第二个字符串的后面。则他将返回一个大于0的值

如果较长的字符串和较短的前半部分与较短的字符串相同。则较短的字符串位于较长的字符串之前。

#include<iostream>
using namespace std;
int main() {
	string s1 = ("babyiloveyou");
	string s2 = ("baby");
	string s3 = ("woxihuanni");
	cout << s1.compare(s2) << endl;
	cout << s1.compare(s3) << endl;
	return 0;
}

输出结果
1
-1

第二个方法和第一个方法类似,但是进行比较时,只使用第一个字符串从pos开始的n个字符

#include<iostream>
using namespace std;
int main() {
	string s1 = ("babyiloveyou");
	string s2 = ("baby");
	cout << s1.compare(0, 4, s2) << endl;
	return 0;
}

输出结果 0

第三个方法使用第一个字符串从pos1开始的n1个字符和第二个字符串从pos2开始的n2个字符比较。

#include<iostream>
using namespace std;
int main() {
	string s1 = ("babyiloveyou");
	string s2 = ("ilove");
	cout << s1.compare(5, 4, s2,1,4) << endl;
	return 0;
}

输出结果 0

修改方法

+=在系统中已经被重载可以直接使用。
append()方法可以将一个字符串追加到另一个字符串的后面。

#include<iostream>
#include<string>
using namespace std;
int main() {
	string s1("woxihuan");
	string s2("ni");
	cout << s1 << endl;
	s1.append(s2);
	cout << s1 << endl;
	s1.append(3, '!');
	cout << s1 << endl;
	return 0;
}

输出结果
woxihuan
woxihuanni
woxihuanni!!!

string类还提供了assign方法
assign 如果第三个参数为空,默认从第二个参数一直到字符串最后一个字符

#include<iostream>
#include<string>
using namespace std;
int main() {
	string s2;
	string s1("woxihuanni");
	s2.assign(s1,1, 3);//s2下标为1开始的3个赋值给s2
	cout << s2 << endl;
	s2.assign(3, 's');//s2为 sss
	return 0;
}

插入方法

	string str1("iyou");
	str1.insert(0,"love");//str1为iloveyou
	cout << str1 << endl;

替换方法

	string str1("iloveyou");
	str1.replace(1, 4, "xihuan");//str1为ixihuanyou
	cout << str1 << endl;//第一个参数代表初始下标  第二个代表替换原串的长度

使用find()来查找需要replace()的位置:

	string str1("i love you face");
	string str2("you");
	string str3("she");
	string::size_type pos = str1.find(str2);
	if (pos != string::npos)
		str1.replace(pos, str2.size(), str3);
	cout << str1 << endl;

str1最后会是“i love she face”

其他
copy()方法将string对象或其中的一部分复制到指定的字符数组中:

size_type copy(charT* s,size_type n,size_type pos=0) const;

警告:copy()方法不追加空值字符,也不检查目标数组的长度是否够用
其中,s指向目标数组,n是要复制的字符数,pos指出从string对象的什么位置开始复制,直到复制了n个字符或者达到string对象的最后一个字符。

swap()方法用一个时间恒定的算法来交换两个string对象的内容。
void swap(basic_string& str);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值