指针、数组、字符串

目录

.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()

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 清零

你可能感兴趣的:(c++)