c++ string超详细总结

16 篇文章 0 订阅

string使用时需要包含头文件<string>,vs里虽然不包含头文件也能用,不过功能不完整,一般建议加入<string>头文件。

1.构造函数:

string s;//无参构造
string s2("Hello");  // s2 = "Hello"
string s3(4, 'K');  // s3 = "KKKK"
string s4("12345", 1, 3);  //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
string s5("12345", 1);  //s4 = "2345",即 "12345" 的从下标 1 之后全赋值给s5

2.赋值:

可以用 "="对 string 对象进行赋值。例如:

string s1;
s1 = "Hello";  // s1 = "Hello"

string 类还有 assign 成员函数,可以用来对 string 对象赋值。assign 成员函数返回对象自身的引用。例如:

string s1("12345");
string s2;
s2.assign(s1);  // s3 = s1
s2.assign(s1, 1, 2);  // s2 = "23",位置1开始长度为2的子串
s2.assign(4, 'K');  // s2 = "KKKK"
s2.assign("abcde", 2, 3);  // s2 = "cde",即 "abcde" 的子串(2, 3)

和vector类似,可以使用push_back向字符串后插入字符:

str.push_back('A')//在str末尾添加一个字符  'A' ,参数必须是字符形式

3.string对象中字符串的连接:

string重载了+=,+操作:

string s1 = "123";
string s2 = "abc";
s1+=s2;//s1此时为"123abc",除此之外s2还可以是char,const char*
string s3=s1+s2;//s3此时为123abc"",或者为string+char,string+const char*(必须有一方是string才能相加)

除了可以使用++=运算符对 string 对象执行字符串的连接操作外,string 类还有 append 成员函数,可以用来向字符串后面添加内容。append 成员函数返回对象自身的引用。例如:

string s1("123"); 
srtring s2("abc");
s1.append(s2);  // s1 = "123abc"
s1.append(s2, 1, 2);  // s1 = "123abcbc"
s1.append(3, 'K');  // s1 = "123abcbcKKK"
s1.append("ABCDE", 2, 3);  // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3)

4.取值操作

通过 [ ] 或 .at( ) 进行取值:

for(int i=0;i<s.size();i++)
{
    cout<<s[i]<<" ";//或使用s.at(i)
}
//区别:[]方式访问越界直接报错,at方式访问越界会抛异常out_of_range,可通过try,catch捕获异常

 除此之外,作为STL标准容器自然也可以通过迭代器访问元素:

for (string::iterator it = s1.begin(); it != s1.end(); it++)
{
	cout << *it << " ";
}

5.string对象的比较

通过ASCLL码比较,除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:

  • 小于 0 表示当前的字符串小;
  • 等于 0 表示两个字符串相等;
  • 大于 0 表示另一个字符串小。
string s1("hello"); 
s2("hello, world");
int n = s1.compare(s2);
n = s1.compare(1, 2, s2, 0, 3);  //比较s1的子串 (1,2) 和s2的子串 (0,3)
n = s1.compare(0, 2, s2);  // 比较s1的子串 (0,2) 和 s2

6.求对象子串 

substr 成员函数可以用于求子串 (n, m),原型如下:

string substr(int n = 0, int m = string::npos) const;

调用时,如果省略 m 或 m 超过了字符串的长度,则求出来的子串就是从下标 n 开始一直到字符串结束的部分。例如:  

string s1 = "this is ok";
string s2 = s1.substr(2, 4);  // s2 = "is i"
s2 = s1.substr(2);  // s2 = "is is ok"

 7. 交换两个string对象的内容

swap 成员函数可以交换两个 string 对象的内容。例如:

string s1("West");
string s2("East");
s1.swap(s2);  // s1 = "East",s2 = "West"

查找子串和字符

8.string的查找和替换

使用find成员函数进行查找:

//find从前往后查找,rfind从后往前查找,找不到返回-1
//这里顺便说一句,找不到的返回值其实是string::npos,是无符号整型,如果转为int就是-1
int find(const string& str,int pos=0)const;//查找str(里面的第一个字符)第一次出现位置,从pos开始查找,默认值为0
int find(const char* s,int pos=0)const;//查找s第一次出现位置,从pos开始查找,默认值为0
int find(const char* s,int pos=0,int n)const;//从pos位置查找s前n个字符出现位置
int find(const char c,int pos=0)const;//查找c第一次出现位置,从pos开始查找

string s="abcdefg";
int pos=s.find("fg");//查找"fg"第一次出现位置,这里,pos为5(rfind查找最后一次出现位置)

replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用。例如:

string s1("Real Steel");
s1.replace(1, 3, "123456", 2, 4);  //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3),替换后s1为R3456 Steel
string s2("Harry Potter");
s2.replace(2, 3, 5, '0');  //用 5 个 '0' 替换子串(2,3)替换后s2为HaOOOOO Potter
int n = s2.find("OOOOO");  //查找子串 "00000" 的位置,n=2
s2.replace(n, 5, "XXX");  //将子串(n,5)替换为"XXX",替换后s2为HaXXX Potter

9.插入和删除子串

insert 成员函数可以在 string 对象中插入另一个字符串,返回值为对象自身的引用。例如:

string s1("Limitless");
string s2("00");
s1.insert(2, "123");  //在下标 2 处插入字符串"123",s1 = "Li123mitless"
s1.insert(2, s2);  //在下标 2 处插入 s2 , s1 = "Li10023mitless"
s1.insert(2, 5, 'X');  //在下标 2 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"

erase 成员函数可以删除 string 对象中的子串,返回值为对象自身的引用。例如:

string s1("Real Steel");
s1.erase(1, 3);  //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5);  //删除下标5及其后面的所有字符,此后 s1 = "R Ste"

10.其他常用成员函数

str.length()//求字符串长度
str.size()//和 length() 一样
str.capacity()//获取容量,包含了不用增加内存就能使用的字符数
str.reasize(10)//设置当前 str 的大小为10,若大小大与当前串的长度,\0 来填充
str.reasize(10,char c)//设置当前 str 的大小为10,若大小大与当前串的长度,字0符c 来填充
str.reserve(10)//设置str的容量 10,不会填充数据

11.一些STL容器的通用算法

使用时需要包含头文件<algorithm>

有的算法可能和string的内置函数功能相似(比如find),注意区别,STL的算法都是输入迭代器操作容器元素。

string s2 = "dcbaef";
sort(s2.begin(), s2.end());//排序后s2为"abcdef"

string::iterator k=find(s2.begin(),s2.end(),'c'); 
//在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找c,若存在返回其在向量中的位置

reverse(s2.begin(), s2.end())//将s2中字符反转

12.string和char*的转换

''abcd''为const char*类型,只能通过 [ ] 方式访问元素,不能用 ,at 方式访问元素

char c='abcd'//最后c为'd'

char*转为string类型直接赋值即可,string类型转char*类型方法如下:

法一:string类的c_str()函数

//直接转换
const char* c = s.c_str();
char* c=(char)s.c_str();

//char[]
string str = "hello";
char p[20];
strcpy_s(p, str.c_str());//(vs2017里strcpy不安全)

//char*
string str = "hello";
char *p;
p = (char *)malloc((str.length()+1)*sizeof(char));
strcpy_s(p, str.length() + 1, str.c_str());
//c_str()返回一个以‘\0’结尾的字符数组,不用手动添加结束符

法二:string类的data函数

string str = "hello";
char *p;
p = (char *)malloc((str.length() + 1) * sizeof(char));
strcpy_s(p, str.length()+1, str.data());

 

参考:c语言中文网

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值