C++ string常见函数总结
-
基础概念
-
对照功能列表:不能直接回答的再去看相应解析说明。
begin 得到指向字符串开头的 Iterator
end 得到指向字符串结尾的 Iterator
rbegin 得到指向反向字符串开头的 Iterator
rend 得到指向反向字符串结尾的 Iteratorsizeof
size 得到字符串的大小
length 和 size 函数功能相同strlen
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
reserve 预留空间resize 重新分配空间
empty 判断是否为空
operator [] 取第几个元素,相当于数组
c_str 取得 C 风格的 const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
erase 删除字符串
clear 清空字符容器中所有内容
assign 和赋值操作符一样
replace 替代
copy 字符串到空间find 查找,返回基于 0 的索引号
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr (n1,len) 得到字符串从 n1 开始的长度为 len 的子串比较字符串 (支持所有的关系运算符)
compare 比较字符串
operator+ 字符串链接
operator+= += 操作符
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入 -
string:相对于C语言,C++独有的概念。归属于标准模板库,<string.h>。
-
字符(串)字面值:用双引号括起来的内容是字符串字面值,用单引号括起来的内容是字符字面值。
-
大小:实际保存的元素个数 size resize
-
容量:在不分配更多内存的情况下,可以保存的最多元素个数 capacity reserve
-
sizeof :常考点是sizeof(struct),需要对齐计算。
sizeof(bool) = 1
sizeof(char) = 1sizeof(string) = 8 32位为4
sizeof(int) = 4
sizeof(float) = 4
sizeof(double) = 8sizeof(long) = 8 32位为4
sizeof(long double) = 16 32位为12sizeof(long long) = 8
sizeof(enum) = 4
sizeof(int *) = 8 32位为4
sizeof(char *) = 8 32位为4,指针类型的长度是固定的
-
-
初始化
string s1; //默认初始化,空字符串
string s2 = s1; string s2(s1); //s2是s1的副本
string s3 = “hello”; string s3( “hello” ); //s3是字符串字面值”hello”的副本
string s4(10, ‘c’); //s4是连续10个字符“c”组成的字符串。
string s5{’a‘,’b’};
- 使用等号初始化是拷贝初始化,其他是直接初始化。拷贝初始化一般只能用于初始值只有一个的情况。
-
查找
-
string1.find(string2, pos, n) 前向搜索特定子串的第一次出现
- 入参:
- string2:必需。可以是string/char*/char。
- pos:非必需。查找的起始位置。
- n:非必需。待查找string的前n个字符。
- 返回值:返回string2第一个字符在string1中的位置,如果没找到返回std::string::npos
- 入参:
-
rfind 从尾部开始,后向搜索特定子串的第一次出现
- 备注:参数与上式类似,只是查找方向从后向前。
-
find_first_of 搜索指定字符集合中任意字符的第一次出现
- 备注:参数与上式类似,但如果在string1 中查找string2,如果 string1 中含有 string2中的任何字符,则就会查找成功。
-
find_last_of 搜索指定字符集合中任意字符的最后一次出现
-
find_first_not_of 搜索不属于指定字符集合中任意字符的第一次出现
- 备注:此函数相比查找功能更倾向于比较功能,可与compare联合记忆。
-
find_last_not_of 搜索不属于指定字符集合中任意字符的最后一次出现
-
-
截取与删除
-
string1.substr(size_t pos, n ) 返回从 pos 开始的 n 个字符组成的字符串,string1内容不被改变
- 入参:
- pos:必需。截取的起始位置
- n:非必需。截取的长度,不填表示截取到末尾。常从上面查找中获取。
- 备注:左闭区间,起始位置是从0开始。
- 入参:
-
string1.erase (size_t pos, n) 删除从pos开始的n个字符组成的字符串,返回被删减后的string1
- 备注:参数与上类似,只是截取变成删除。
-
string1.erase (iterator p) 删除p处单字符,返回被删减后的string1
- 备注:p是string类型迭代器,注意与上式单入参时含义的区别。
-
string1.erase (iterator first, iterator last) 删除从first到last区间的字符串,返回被删减后的string1
- 备注:删除区间为左闭右开,str1.erase(str1.begin(),str1.end()-1)表示保留最后一位字符。
-
-
赋值(赋值的方法太多了,也很基础就简单提一下)
-
string1.assign(string2) string2可以是string或char *
string1.assign(string2, pos, n) string2可以是string或char *
-
记录一个特殊的情况(实际也很少有人会这样用),当使用string下标赋值时,需要先保证下标可访问(默认初始化只是空字符串),即需要开辟相应内存空间。
string a; a.resize(3); for(int i = 0; i < a.size(); i++) a[i] +='a';
-
-
比较(这个大部分是摘抄的,出处找不到了),主要是注意这些命令的适用场景不同
strcmp (windows/linux) 原型:int strcmp (char *s1,char * s2); 功能:比较字符串 s1 和 s2。 说明: 当 s1<s2 时,返回值 < 0 当 s1=s2 时,返回值 = 0 当 s1>s2 时,返回值 > 0 举例: char *s1="Hello, Programmers!"; char *s2="Hello, programmers!"; r=strcmp (s1,s2); //r 小于 0, 参见 ascii 表 ----------------------------------------------- stricmp,strcmpi(Windows独有的函数,Linux用strcasecmp) 原型:int stricmp (char *s1,char * s2); 功能:比较字符串 s1 和 s2,但不区分字母的大小写。 说明:strcmpi 是到 stricmp 的宏定义,实际未提供此函数。 当 s1<s2 时,返回值 < 0 当 s1=s2 时,返回值 = 0 当 s1>s2 时,返回值 > 0 ----------------------------------------------- strncmp (windows/linux) 原型:int strcmp (char *s1,char * s2,int n); 功能:比较字符串 s1 和 s2 的前 n 个字符。 说明: 当 s1<s2 时,返回值 < 0 当 s1=s2 时,返回值 = 0 当 s1>s2 时,返回值 > 0 ----------------------------------------------- strnicmp,strncmpi (Windows独有的函数,Linux用strncasecmp) 原型:int strnicmp (char *s1,char * s2,int n); 功能:比较字符串 s1 和 s2 的前 n 个字符但不区分大小写。 说明:strncmpi 是到 strnicmp 的宏定义 当 s1<s2 时,返回值 < 0 当 s1=s2 时,返回值 = 0 当 s1>s2 时,返回值 > 0 -----------------------------------------------
-
拼接
-
strcat与strncat
strcat (windows/linux) 原型:char *strcat (char *dest,char *src); 功能:把 src 所指字符串添加到 dest 结尾处 (覆盖 dest 结尾处的 '\0') 并添加 '\0'。 说明:src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符串。 返回指向 dest 的指针。 举例: char d[20]="Golden Global"; char *s=" View"; strcat(d,s); ---------------------`-------------------------- strncat (windows/linux) 原型:char *strncat (char *dest,char *src,int n); 功能:把 src 所指字符串的前 n 个字符添加到 dest 结尾处 (覆盖 dest 结尾处的 '\0') 并添加 '\0'。 说明:src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符串。 返回指向 dest 的指针。 -----------------------------------------------
-
append 比较常用,直接上个说明代码即可
// appending to string #include <iostream> #include <string> int main () { std::string str; std::string str2="Writing "; std::string str3="print 10 and then 5 more"; // used in the same order as described above: str.append(str2); // "Writing " str.append(str3,6,3); // "10 " str.append("dots are cool",5); // "dots " str.append("here: "); // "here: " str.append(10u,'.'); // ".........." str.append(str3.begin()+8,str3.end()); // " and then 5 more" str.append<int>(5,0x2E); // "....." std::cout << str << '\n'; return 0; }
-
push_back(char c)
- 与append类似,但append只能添加const char,push_back只能加char。
-
+=
-
常用的方式,但要注意不能两个char直接相加。
string s; char a, b; //s = a + b + s; 错误 s = s + a + b; 正确
-
-
-
字符数组,字符指针,字符串转换
-
string转char*
-
c_str() 将string转为const char *
- C语言中没有string,要利用c_str()转化后使用,并且不能对转化后的值做修改(该问题易出现在入参为char*的函数中)
-
data()
- 与上类似,根据C++reference说明,区别在于c_str()保证最后一个字符是‘\0’,而data()不保证。所以都用c_str()即可。
-
copy(char*s, size_t len, size_t pos = 0) 特别注意这里第二个参数是长度,第三个是起始位置,这和一般情况正相反
-
该函数不会自动在尾部加’\0’,使用时注意手动加上。
string str="hmmm"; char p[50]; str.copy(p, 5, 0);//这里5代表复制几个字符,0代表复制的位置, *(p+5)=‘\0’;//注意手动加结束符!!!
-
-
-
char* 转 string 直接赋值即可。
-
string 转 char[] 利用length()获取string长度,然后遍历将下标付给char[]即可。
-
char[] 转 string 直接赋值即可。
-
参考资料:
https://blog.csdn.net/qq_37891604/article/details/79709876