目录
.c_str、.data()
字符串替换
清除
string的底层就是用char类型的数组实现的,C++11标准后,string的末尾也以'\0'结尾
那string是否就是数组呢,我们把它的地址打印出来看一下
结论:string不是单纯的数组和指针
string strA{ "012345" };
std::cout << (int)&strA << " " << (int)&strA[0] << " " << (int)&strA[1];
输出结果
19921356 19921360 19921361 这里为什么要转换成int呢?因为只有这样,它才会打印出地址,否则打印的是strA里面的字符
可以看到string的内存模拟如下
未知 | 未知 | 未知 | 未知 | string[0] | string[1] |
前四个字节不知道放了什么数据,后面两个依次放入了string的第一个字符和第二个字符
当我们往strA里添加数据时,它的地址又变了
string strA{ "012345" };
std::cout << (int)&strA << " " << (int)&strA[0]
<< " " << (int)&strA[1]<
13631008 13631012 13631013
13631008 15534800 15534801 说明加了东西后,它又重新分配内存了
那如果我们要使用string的内存,怎么使用呢
c_str、data()都会返回一个const char*的指针,指向内存空间
就是因为两个方法返回值一样,所以C++17修改了data()的返回值
在C++17标准下,data()返回的是char*
string strA{ "012345" };
const char* ptr = strA.c_str();
std::cout << (int)&strA << " " << (int)&strA[0]
<< " " <<(int) ptr;
17824348 17824352 17824352
.replace()
.replace(替换的起始位置,要替换的长度,“要替换的字符串”)
string strA{ "id=username" };
strA.replace(3, 8, "peter");
std::cout << strA;
.replace(替换的起始位置,要替换的长度,替换后的字符长度,‘要替换的字符’)
string strA{ "id=username" };
strA.replace(3, 8, 6,'a');
std::cout << strA;
这里输出了id=aaaaaa
.replace(替换的起始位置,要替换的长度,“要替换的字符串”, 要替换的字符串的长度)
string strA{ "id=username" };
strA.replace(3, 8, "peterabcde",5);
std::cout << strA;
.replace(替换的起始位置,要替换的长度,要替换的字符串”, 要替换的字符串起始位置,要替换的字符串的长度)
string strA{ "id=username" };
strA.replace(3, 8, "abcdepeterabcde",5,5);
std::cout << strA;
.erase
..erase(起始位置,要清除的长度)
..erase(起始位置) //如果没有第二个参数,默认清除后面所有
.clear 清零