C语言风格的字符串
需包含头文件<cstring>,或写成<string.h>
C风格的字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。
- 输入字符串长度一定小于已定义的字符数组长度,最后一位是/0终止符号;不然输出时无法知道在哪里结束。
字符数组的定义和初始化
strcat(char s1[],const char s2[]);//将s2接到s1上
strcpy(char s1[],const char s2[]);//将s2复制到s1上
strcmp(const char s1[],const char s2[]);//比较s1,s2 s1>s2返回1 相等返回1,否则返回-1
strlen(char s[]);//计算字符串s的长度 字符串s的实际长度,不包括\0在内
strcat()

strcpy()

strcmp()相等返回0,否-1

strlen()计算字符串的实际长度,不包括\0在内

C++字符串
包含头文件<string>
字符串的定义与初始化
string s1(); // si = ""
string s2("Hello"); // s2 = "Hello"
string s3(4, 'K'); // s3 = "KKKK"
string s4("12345", 1, 3); //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
string a;
string b=a;//也可以写成string b(a)
string c="hello";//string c("hello")
string f=(c,1);//将字符串c中从下标1开始到字符串结束的位置作为字符串初值

string 类没有接收一个整型参数或一个字符型参数的构造函数。下面的两种写法是错误的:
string s1('K');
string s2(123);
assign 成员函数,可以用来对 string 对象赋值。assign 成员函数返回对象自身的引用。例如:
string s1("12345"), s2;
s3.assign(s1); // s3 = s1
s2.assign(s1, 1, 2); // s2 = "23",即 s1 的子串(1, 2)
s2.assign(4, 'K'); // s2 = "KKKK"
s2.assign("abcde", 2, 3); // s2 = "cde",即 "abcde" 的子串(2, 3)
length(),size()求字符串的长度
capacity()返回当前容量(即string中不必增加内存即可存放的元素个数,一般是15,如果超过了15获得的容量大小就跟size()是一样的)
string s="hello";
cout<<s.length();//5
cout<<s.size();//5
cout<<s.capacity();//15
resize(n,s)改变容器的大小设置为n
如果n<原来容器的大小,则保留原容器前n个元素,超过n的全部去除
如果n>原来容器的大小,则重新分配内存空间,并且在原来数据末尾插入数据合适数量的单个数据s是容器的大小达到n

append()字符串连接
- 字符连接可以用符号+或+=,还可以用append()函数
- append(s):直接把数据s添加到字符串末尾
- append(s,start,end):在原来的字符串末尾添加s字符串从索引为start开始到索引为end结束的字符,end超过s的长度则直接添加s
- append(s,n):在原来字符串末尾添加s字符串从左往右取n个的字符
- append(n,c):在原来字符串末尾添加n个c字符
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "he";
s.append("123");
cout << s << endl;
s.append("ding", 1, 4);
cout << s << endl;
s.append("char", 3);
cout << s << endl;
s.append(3, 'k');
cout << s << endl;
return 0;
}

insert()
- insert(index,n,c):在index位置插入n个字符c
- insert(index,s):在index位置插入字符串s
- insert(index,s,n):在index位置插入字符串s从头开始的n个字符
- insert(index,s,strat_index,n):在index位置插入字符串s从索引为strat_index开始的n个字符



string比较compare()
除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:
- 小于 0 表示当前的字符串小;
- 等于 0 表示两个字符串相等;
- 大于 0 表示另一个字符串小。
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
n = s1.compare("Hello");
n = s1.compare(1, 2, "Hello"); //比较 s1 的子串(1,2)和"Hello”
n = s1.compare(1, 2, "Hello", 1, 2); //比较 s1 的子串(1,2)和 "Hello" 的子串(1,2)
string 对象的子串substr()
substr(n,m),如果省略了m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "apple";
string b = s.substr(1, 4);
cout << s << endl
<< b << endl;
string c = s.substr(2);
cout << c;
return 0;
}

交换两个字符串内容swap()
string s1("West”), s2("East");
s1.swap(s2); // s1 = "East",s2 = "West"
字符串替换replace()
replace(0, 5, str); //用str替换从指定位置0开始长度为5的字符串
replace(0, 9, str, 4); //用str的前4个字符替换从0位置开始长度为9的字符串
replace(0, 9, 3, c); //用重复3次的c字符替换从指定位置0长度为9的内容
replace(19,6,str,9,6) //用str的从索引为9开始长度为6的字符串去替换原来字符串从19位置长度为6的内容
字符串删除erase()
string s1("Real Steel");
s1.erase(1, 3); //删除子串(1, 3),此后 s1 = "R Steel"
s1.erase(5); //删除下标5及其后面的所有字符,此后 s1 = "R Ste"
查找字符串函数find()、rfind()
所有string字符串查找函数都有唯一的返回类型,就是size_type,即一个无符号整数,若查找成功,返回查找规则的第一个字符或者子串的位置,若查找失败,则返回npos,
- find:从前往后查找子串或字符出现的位置。
- rfind:从后往前查找子串或字符出现的位置。
- find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:
- s1.find_first_of("abc"); //查找s1中第一次出现"abc"中任一字符的位置
- find_last_of:从后往前查找何处出现另一个字符串中包含的字符。
- find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。
- find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。
#include<iostream>
#include<string>
using namespace std;
int main()
{
//测试size_type find (charT c, size_type pos = 0) const noexcept;
string st1("babbabab");
cout << st1.find('a') << endl;//1 由原型知,若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
cout << st1.find('a', 2) << endl;//4 在st1中,从位置2(b,包括位置2)开始,查找字符a,返回首次匹配的位置,若匹配失败,返回npos
cout << st1.find('a', 100) << endl;//4294967295 当查找的起始位置超出字符串长度时,按查找失败处理,返回npos
string st2("aabcbcabcbabcc");
string str1("abc");
cout << st2.find(str1, 2) << endl;//6 从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回npos
cout << st2.find("abc", 2) << endl; //6 同上,只不过参数不是string而是char*
cout << st2.find("abcdefg", 2, 3) << endl;//6 取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)
cout << st2.find("abcbc", 0, 6) << endl;//4294967295 第3个参数超出第1个参数的长度时,返回npos
return 0;
}

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1("Source Code");
int n;
if ((n = s1.find('u')) != string::npos) //查找 u 出现的位置
cout << "1) " << n << "," << s1.substr(n) << endl;
//输出 l)2,urce Code
if ((n = s1.find("Source", 3)) == string::npos)
//从下标3开始查找"Source",找不到
cout << "2) " << "Not Found" << endl; //输出 2) Not Found
if ((n = s1.find("Co")) != string::npos)
//查找子串"Co"。能找到,返回"Co"的位置
cout << "3) " << n << ", " << s1.substr(n) << endl;
//输出 3) 7, Code
if ((n = s1.find_first_of("ceo")) != string::npos)
//查找第一次出现或 'c'、'e'或'o'的位置
cout << "4) " << n << ", " << s1.substr(n) << endl;
//输出 4) l, ource Code
if ((n = s1.find_last_of('e')) != string::npos)
//查找最后一个 'e' 的位置
cout << "5) " << n << ", " << s1.substr(n) << endl; //输出 5) 10, e
if ((n = s1.find_first_not_of("eou", 1)) != string::npos)
//从下标1开始查找第一次出现非 'e'、'o' 或 'u' 字符的位置
cout << "6) " << n << ", " << s1.substr(n) << endl;
//输出 6) 3, rce Code
return 0;
}

3955

被折叠的 条评论
为什么被折叠?



