文章目录
基本认识
1.头文件
#include<string>
using namespace std;
2.底层
string类型其实是容器,所以它有容器都有的begin()、end()、back()等等。
创
1.构造一个空的string类型
//定义和赋值
string str1;
str1="hello";
//同时初始化
string str2="world";
2.拷贝
string s(str)
拷贝构造后产生新的string类型,原来的被改变后新的也不会被改变。
#include <iostream>
using namespace std;
int main()
{
string str1="hello";
cout << str1 << endl;
//hello
string str2(str1);
cout << str2 << endl;
//hello
/*原来的被改变后新的也不会被改变*/
str1 = "world";
cout << str1 << endl;
//world
cout << str2 << endl;
//hello
return 0;
}
- string s(str,stridx):复制字符串str内 从下标stridx开始 的部分
string str1="abcde";
string str2(str1,2);
cout << str2 << endl;
//cde
string s(str,stridx,strlen)
:将字符串str内 从stridx开始且长度顶多strlen 的部分作为字符串的初值
/*如果字符串下标不超过strlen*/
string str1="abcde";
string str2(str1,2,2);
cout << str2 << endl;
//cd
/*如果字符串下标超过strlen*/
string str1="abcde";
string str2(str1,2,10);
cout << str2 << endl;
//cde
//不会出错
string s(beg,end)
:复制从beg不到end内的部分
string str1="abcde";
string str2(str1.begin(),str1.end());
cout << str2 << endl;
//abcde
3.从字符直接转化
string s(chars[])
:将C字符数组作为s的初值。只转换’\0’之前部分的字符(空格也算)
/*char[]是变量*/
char cstr1[10] = "abc";
string str1(cstr1);
cout << str1 << "!" << endl;
//abc!
//空格也算
char cstr2[10] = "abc ";
string str2(cstr2);
cout << str2 << "!" << endl;
//abc !
/*char[]是字符常量*/
string str1("abc");
cout << str1 << "!" << endl;
//abc!
//空格也算
string str2("abc ");
cout << str2 << "!" << endl;
//abc !
string s(chars[],chars_len)
:将C字符串前chars_len个字符作为字符串s的初值。
/*char[]是变量*/
char cstr1[10] = "abcdef";
string str1(cstr1,3);
cout << str1 << endl;
//abc
/*char[]直接是字符常量*/
string str2("abcdef", 3);
cout << str2 << endl;
//abc
string s(num,char)
:生成一个字符串,包含num个char字符。常用想在控制台输出-----------
时。
string str(10, '-');
cout << str << endl; //----------
4.从其他类型通过函数转化
// 获取数字的位数
int num = -1222;
int n = to_string(num).size();
n = num >= 0 ? n : n - 1;
查
1.查大小
①使用vector的str.size()
string str1="abcde";
cout << str1.size() << endl;
//5
②使用str.length()
string str1="abcde";
cout << str1.length() << endl;
//5
2.比较string:使用==、<、>等运算符
①==、!=
string str1 = "abc";
string str2 = "abc";
if (str1 == str2)
{
cout << "abc == abc" << endl;
}
//abc == abc
string str1 = "cba";
string str2 = "abc";
if (str1 != str2)
{
cout << "cba != abc" << endl;
}
//cba != abc
②<、>
- abc < abcd
- aaaa < abcd
- aa < abcd
- ad > abcd
③<=、>=组合符
string str1 = "abcd";
string str2 = "abcd";
if (str1 <= str2)
{
cout << "abcd <= abcd" << endl;
}
//abcd <= abcd
string str3 = "ab";
string str4 = "abcd";
if (str3 <= str4)
{
cout << "ab <= abcd" << endl;
}
//ab <= abcd
3.单个:获得指定位置的字符
str[]
:str1[0]
str.at(i)
:str1.at(0)
- 迭代器
string::iterator
string str1 = "abc";
string::iterator i = str1.begin();
cout << *i << endl;
- 首尾
string str1="abcde";
cout << str1.front() << endl; //a
cout << str1.back() << endl; //e
4.遍历
for(int i = 0;i<str1.size();i++)
- foreach
string str1 = "abc";
for(auto c:str1){
cout << c << " ";
}
5.获取字串substr()
s.substr();
:返回s的全部内容s.substr(2);
:从索引2往后的子串s.substr(2, 3);
:从索引2开始3个字符
PS:我们可以使用string::npos
来表示到结尾。s.substr(2, string::npos)
。等同方法2.
string str = "abcdefg";
cout << str.substr() << endl;
//abcdefg
cout << str.substr(2) << endl;
//cdefg
cout << str.substr(2,3) << endl;
//cde
cout << str.substr(2,string::npos)<<endl;
//cdefg
6.find查找
find(ch)
/find_first_of(ch)
:找到第一个符合的就返回下标,没找到返回-1find_first_not_of(ch)
:找到第一个不符合的下标。都符合就返回-1.find_last_of(ch)
:找到最后一个符合的下标。一个都没找到返回-1。find_last_not_of(ch)
:找到最后一个不符合的下标。都符合就返回-1.
string str1 = "hello";
int i1 = str1.find('k');
cout << i1 << endl; // -1
int i2 = str1.find('l');
cout << i2 << endl; // 2
增
1.s.append()中s.append(“123”,2)和s.append(string, 2)不同
函数原型
//结尾拼接上count个重复的字符ch
string.append(size_t count,char ch)
//结尾拼接上C字符串数组cstr的前count个字符,count超过cstr的大小
string.append(char[] cstr,size_t count)
//结尾拼接上string类型的str,含义类似substr()
string.append(string str,size_type _Off = 0, size_type _Count = npos)
string str1 = "hello";
string str2 = "hello";
string str3 = "hello";
string appendstr = "abcdef";
char appendcstr[] = "abcdef";
/*拼接string,从下标2到结束(包括)*/
str1.append(appendstr, 2);
cout << str1 << '!' << endl;
//hellocdef!
/*拼接cstr字符串,前两个字符*/
str2.append("abcdef", 2);
cout << str2 << '!' << endl;
//helloab!
/*拼接cstr字符串,前两个字符*/
str3.append(appendcstr, 2);
cout << str3 << '!' << endl;
//helloab!
2.加个字符
s+='a';
:拼接上一个字符’a’s.push_back('a');
:拼接上一个字符’a’s.append(1,'x');
:拼接上一个字符’a’。没有s.append(‘x’)对应的函数原型,不行s.append(5,'x');
:拼接上五个字符’a’
3.加个字符串
s+=str;
:加个string字符串s+="my";
:加个C字符串s.append(str);
:加个string字符串s.append("my");
:加个C字符串s.append("world",3);
:加上wors.append(str, 2);
:加上从下标2开始到结尾的字符串部分s.append(str,1, 3);
:加上从下标1开始的3个字符串部分
改
1.交换字符串swap()
这是<string.h>
里就有的,不用写<algorithm>
string str1 = "abcd";
string str2 = "cba";
swap(str1, str2);
cout << str1 << endl;
//cba
cout << str2 << endl;
//abcd
2.修改某个
直接上:
string str1 = "hello";
str1[0] = 'i';
// str1.front() = 'i'; //也行
cout << str1 << endl; // iello
其他
1.spilt自定义函数
原型定义
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if ("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char* strs = new char[str.length() + 1]; //不要忘了
strcpy(strs, str.c_str());
char* d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char* p = strtok(strs, d);
while (p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
delete[] strs;
delete[] d;
return res;
}
调用
得用"分割字符"
,而不能用'分割字符'
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if ("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char* strs = new char[str.length() + 1]; //不要忘了
strcpy(strs, str.c_str());
char* d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char* p = strtok(strs, d);
while (p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
delete[] strs;
delete[] d;
return res;
}
int main() {
string str1 = "hello world !!!!";
char str2[] = "a beautiful day";
vector<string> result1 = split(str1, " ");
vector<string> result2 = split(str2, " ");
for (int i = 0; i < result1.size(); i++) {
cout << result1[i] << endl;
}
for (int i = 0; i < result2.size(); i++) {
cout << result2[i] << endl;
}
return 0;
}
/*
hello
world
!!!!
a
beautiful
day
*/
2.截取字符串长度resize()
void resize(int len,char c=' ');
字符串当前大小置为len,多去少补,多出的字符c填充不足的部分
/*默认填充空格*/
string str = "abcde";
str.resize(10);
cout << str << '!' << endl;
//abcde !
str.resize(3);
cout << str << '!' << endl;
//abc!
/*填充指定字符*/
string str = "abcde";
str.resize(10, 'c');
cout << str << endl;
//abcdeccccc
str.resize(3);
cout << str << endl;
//abc
3.cctype
参考资料:
入门:https://www.cnblogs.com/X-Do-Better/p/8628492.html
详解:https://blog.csdn.net/zhanshen112/article/details/84102319
https://blog.csdn.net/Wchenchen0/article/details/81042596