//string封装了字符串相关的操作
//内部实现和vector类似,操作接口上增加了字符串的接口。
//string内部仍然是一个char型数组,并且也是以0结尾的。对外提供了常用的函数。
//如:append,clear,at,length等操作,并支持赋值、复制等操作。
1.构造string的几种方式
string str1 ("xiaoming");//以C风格构造字符串
string str2 = "wanghua" ;//同上一种方式
string str3 ("abcde",5) ;//参数1是字符串,参数2是长度
string str4; //空字符串
string str5 = ""; //同上,空字符串
取得字符串内部的char*
string str = "xiaoming " ;
const char* p = str.c_str();
2.append/clear
append:在末尾添加字符或者字符串
string str;
str.append("something else");//附加一个字符串
str.append("abcde",5);//附加一个字符串,拷贝5个字符
str.append("abcde",1,3);//拷贝1-3位置的字符,“bcd”
str.append(2,'h');//附加2个h
string重载了操作符+ =,也是用于附加字符串的功能
str +="hello";
str +='h';
3.size/capacity/resize/clear/length
size/length:已经储存的字符长度
capacity:容量
resize:显式的设置string内部缓冲区的容量
clear:清楚所有字符。
string str;
str.resize(1024);
str.clear();
str.append();
str.append();
.......
4.at
at用于按索引访问字符,返回的是一个引用。因此可以用at来改变字符串的内容。
例如:
str.at(0)=‘k’;
char ch = str.at(0);
string 也重载了操作符[],作用与at相同。
str[0]=‘k’;//推荐使用!!
5.字符串的比较
string重载了关系符,字符串可以比较大小
6.字符串的查找
find函数用于查找一个字符或者字符串,从左往右查找,直到第一次,返回匹配的位置,如果没有匹配的,则返回-1.
例如:
string str(“Liming is doing homework!”);
int pos = find(‘i’);
如果原字符串包含多个i,则返回第一个所在的位置(偏移)。
如果想往后查找,就需要设置第二个参数,该参数表示起始位置偏移 。
例如:
int pos = find(‘i’,offset) ;
也可以查找子串:
int pos = find(“ing”) ;
返回的是第一次出现的位置
find_first_of:查找第一个~字符
find_first_not_of:查找第一个非~字符
7.substr
用于拷贝部分子串,带两个参数。第一个参数:offset,表示起始位置,第二个参数,表示要截取的子串长度,如果第二个省略,默认截取到结束
8.string作为函数参数
常见的:
void test(const& string str);
void test(string& str);
一般不直接用string str,因为这仅仅是传值,没效率 。
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
// 1号方式
void test(const string& t)
{
}
// 2号方式
void test(string& t)
{
}
// 这种方式避免使用,请参考1号方式
void test(string t)
{
}
int main()
{
// string str1 ("LiMing"); // 以一个C风格字符串构造
// string str2 = "WangHua"; // 同上一种方式
// string str3 ("abcde", 3); // 参数1是C字符串,参数2参数是长度
// string str4; // 空字符串
// string str5 = ""; // 同上,空字符串
// string str6 = NULL; // 不能初始化为NULL
// 取得字符串内部的char*
string text("hello,world!\n");
const char* p = text.c_str();
printf("str: %s \n", text.c_str());
//
string t1;
t1.append("something else"); // 附加一个字符串
t1.append("abcde", 5); // 附加一个字符串:拷贝前5个字符
t1.append("abcde", 1, 3); // 附加一个字符串:
// 起点offset=1, 长度3,即拷贝"bcd"
t1.append(4, 'h'); // 附加2个’h’字符
// 考虑效率问题
string t2;
t2.resize(1024);
t2.clear();
t2.append("ab");
t2.append("cd");
//
string t3 = "hello";
t3[1] = 'i'; // 推荐使用
t3.at(1) = 'c'; // 不推荐
// 字符串的比较
string t4 = "yes";
if( t4 == "yes")
{
printf("相等\n");
}
// 字符串的查找
string t5 = "LiMing is doing homework";
int p1 = t5.find('i'); // 返回1
int p2 = t5.rfind('e'); //
// 存在,则返回其位置;否则,返回-1
// 返回子串
string t6 ("abcdefg");
string r1 = t6.substr(4); // 返回"efg"
string r2 = t6.substr(4,2); // 返回"ef"
return 0;
}