string常用特性
- string对象的长度用成员函数length()读取;
string s("hello");
cout<<s.length()<<endl;
- string支持getline函数
string s;
getline(cin,s);
- string的赋值
s2 = s1;
s3.assign(s1); //把s1赋值给s3
s3.assign(s1,1,3); //把s1中从下标1开始复制3个字符到s3中
也可以单个赋值:
s2[5] = s1[3] = 'a';
- 逐个访问
string s1("hello");
for(int i = 0; i<s1.length(); i++)
cout<<s1.at(i)<<endl;
成员函数at()会做范围检查,如果超出范围,会抛出out_of_range异常,而下标运算符[]不会做范围检查。
vector<string>的遍历方式后面再提。
- 可以用 + 连接字符串
- 可以用append连接字符串
string s1("good "),s2("morning!");
s1.append(s2);
//good morning
s2.append(s1,3,s1.size());
//morning!d 。
如果3+s1.size()超过了字符串长度,则复制到字符串最后一个字符
- 比较compare
可以s1.compare(1,2,s3,0,3);比较一部分
- 字串substr()
s2 = s1.substr(4,5);
- 查找find()、rfind()
返回第一次出现的地方(索引),没找到则返回string::npos
rfind()倒查
额外用法:s.find("ll",2) 从下标为2的地方开始查找字符串"ll"
find_first_of("abcd")查找"abcd"中任何一个字符第一次出现的地方
find_last_of()、find_first_not_of()、find_last_not_of()同理
- s.erase()删除
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
- s.replace(2,3,"haha")
从下标2开始的3个字符替换为“haha”
- s.insert()插入
s1.insert(5,s2);
s1.insert(2,s2,5,3)
- s.c_str()转换成char *字符串,末尾有 ‘\0’
s.c_str()返回的是一个 const char *指针,可以用于:
例如printf("%s\n", 此处需要一个char*指针);
注意:尽量使用 char c[20]; strcpy(c,s.c_str()); 而不要使用char* c = s.c_str();
因为在s对象被析构之后,c就变成了野指针。
- s.data()
返回char *指针,并且末尾没有 ‘\0’