C++字符串操作总结

char*与string

    char* 属于指针类型,string是C++中的类,其底层是通过char* 类型的指针来实现的,即string对象中包含了一个char*类型的成员。通过如下方式可以获取该指针成员:

string str = "nihao";
//data()返回的是const char*类型,意思就是阻止外部修改
const char* data1 = str.data();
cout << "data1=" << data1 << endl;  
//但事实上我们可以通过const_cast来转除返回值的const属性,此操作是危险的,
//因为此后对data2的修改都会对原来的string对象产生同样的效果,最好不要这样做。
char* data2 = const_cast<char*>(str.data());
*data2 = 'w';
cout << "data2=" << data2 << endl;
cout << "str=" << str << endl;

结果如下所示:

data1=nihao
data2=wihao
str=wihao

    另外使用str.c_str()可以将其转化为一个char*类型的结果,并且对转化后的结果进行操作不会对原string对象产生影响。

string的初始化

string str0;            //默认构造,为空,str.size() == 0;
string str1("nihao");   //带参构造,参数为const char*或者char*
string str2(str1);      //拷贝构造
string str3(10, '\0');  //初始化大小为10,且以'\0'填充
string str4 = str3;     //拷贝构造
string str5 = "nihao";  //可能是调用带参构造函数,即等同于string str5("nihao");
str0 = str1 = "ninhao"; //调用两种赋值运算符,即参数为string类型和参数为const char*类型
string str6(str1.begin(), str1.begin()+3); //将"nih"拷贝给str6,左闭右开
char s[] = "abcde";  
string str7(s+1, s+4); //将"bcd"拷贝给str7,左闭右开

string的插入、删除和查找

1.插入

string str = "Hello world!";

str.append(1, ' ').append(3, 'h');  //尾部插入n个字符,并返回该对象,可链式使用
cout << str << endl;
str.push_back('h'); //尾部添加一个字符
cout << str << endl;
str.insert(0, "Wow, "); //在指定位置插入一个字符串,包括该位置
cout << str << endl;

输出结果如下所示:

Hello world! hhh
Hello world! hhhh
Wow, Hello world! hhhh

2.删除

string str = "Hello world!";

str.pop_back();  //从尾部删除一个字符
cout << str << endl;
str.erase(9);    //从9的位置开始删除直到结尾
cout << str << endl;
str.erase(1, 2); //从1的位置开始删除2个字符
cout << str << endl;
str.clear();     //清空元素,但不回收空间

输出结果如下所示:

Hello world
Hello wor
Hlo wor

3.查找

string str = "Heelloelel";

string substr = "el";
int pos = 0;
pos = str.find(substr);  //从开始位置查找子串第一次出现的位置
cout << pos << endl;
pos = str.find(substr, 5); //从5的位置开始查找子串第一次出现的位置
cout << pos << endl;
pos = str.rfind(substr); //从尾部开始向前查找子串第一次出现的位置
cout << pos << endl;
pos = str.find_first_of(substr); //查找子串第一次出现的位置
cout << pos << endl;
pos = str.find_last_of(substr); //查找子串最后一次结束的位置
cout << pos << endl;
pos = str.find_first_not_of(substr); //查找第一个不是以子串开始的位置
cout << pos << endl;
pos = str.find_last_not_of(substr); //查找第一个子串之后最后一个不以子串结束的位置
cout << pos << endl;              

输出结果如下所示:

2
6
8
1
9
0
5

字符串操作

1.字符串分割

string str = "hello world!";

//使用substr截取子串
string tmp;
tmp = str.substr(3); //从3的位置截取直到结尾,substr不改变原串
cout << tmp << endl;
tmp = str.substr(6, 5); //从6的位置截取5个字符
cout << tmp << endl;

//使用strtok按分隔符进行分割
vector<string> ret;
char* strc = new char[str.length() + 1];
strcpy(strc, str.data()/*str.c_str()*/); //分割之前需要提取str中的字符串为char*类型
char* splitStr = strtok(strc, " "); //以空格进行分割
while (splitStr != NULL) {
	ret.push_back(string(splitStr));
	splitStr = strtok(NULL, " ");
}
for (int i = 0; i < ret.size(); ++i) 
	cout << "第" << i + 1 << "个单词: " << ret[i] << endl;

输出结果如下所示:

lo world!
world
第1个单词: hello
第2个单词: world!

2.字符串比较

string A = "abfsd";
string B = "abffd";
//A与B按字典序比较,A>B,返回1;A<B,返回-1;否则返回0。
cout << A.compare(B) << endl;
//A的"bf"与B的"bf"比较,其中1表示从1的位置开始比较,2表示比较的长度为2
cout << A.compare(1, 2, B, 1, 2);
//除了以上比较方式,还可以使用比较运算符==,>,<,!=等。

//也可以将string转化为char*,然后通过strcmp和strncmp进行比较。

字符串与数字互转

1.字符串转数字

string s = "101";
cout << stoi(s, nullptr, 2) << endl;  //以2进制进行转化
cout << stoi(s) << endl;              //默认以10进制进行转化
//atoi需要包含cstdlib或stdlib.h头
cout << atoi(s.c_str()) << endl;      //将string转化为char*,再调用atoi进行转化

输出结果如下:

5
101
101

1.数字转字符串

int a = 10;
char bu[20] = { 0 };
cout << to_string(a) << endl; //将任意类型数值转化为字符串
_itoa(a, bu, 2);       //转化为2进制字符串,存放在bu中
cout << bu << endl;

输出结果如下:

10
1010

其他

string A = "sdasd";
A.resize(4);       //改变size,capacity随size增大而增大,size减小,capacity不变
cout << A << endl; //size减小时,多余部分会被裁剪掉

A.resize(10);       //size增大时,会自动以'\0'初始化
A.push_back('t');
cout << A << endl; 
if (A[6] == '\0') cout << "以\\0填充" << endl;

A.reserve(100);     //扩大了capacity,但size没有变
cout << A.size() << endl;
A.shrink_to_fit();  //根据size的大小,调整capacity至合适的大小
cout << A.size() << endl; //不改变size,但可能改变capacity

cout << A.back() << endl;  //尾部元素
cout << A.front() << endl; //首部元素

reverse(A.begin(), A.end()); //字符串逆序
string B(A.rbegin(), A.rend()); //字符串逆序

输出结果如下所示:

sdas
sdas      t
以\0填充
11
11
t
s

总结

  • 尾部插入字符使用push_back或append,中间插入字符或字符串使用insert
  • 截取子串使用substr,若分割字符串,可将字符串转化为char*,再通过strtok进行分割
  • 在任意位置删除字符串中一个或多个字符,使用erase
  • 查找字符串使用find或rfind
  • 字符串比较可直接使用比较运算符,特殊情况使用compare,如比较字符串中的子串
  • 字符串转数字使用stoi(str, 0, n),按n进制进行转化;数字转字符串使用_itoa(str, buf, n),以n进制进行转化
  • 使用resize可使字符串的size增大或减小
  • 字符串逆序使用std::reverse()函数,或者使用string B(A.rbegin(), A.rend())来将A逆序拷贝给B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值