找
存在返回首字母的位置
未找到返回string::npos(-1)
string = "bbca";
a.find("ca");//2
a.find("abc");//-1
但是cout<<string::npos并不是-1 而是18446744073709551615 因为直接用cout进行输出就是按无符号整型进行输出 npos是size_t类型 size_t是无符号整型
printf(“%d”,string::npos)的结果是-1
string::nPos
nPos的定义
static const size_t npos = -1;
初始化
string a = abc;//string a("abc");
string b(a,1,2);//从a字符串的1位置复制两个字符 bc
string c("abc",1,2);//同上 bc
string d(8,'k');//kkkkkkkk 用8个k初始化
获取string内部数据
string a = "abc";
//printf("%s",a);//这样是不行的
printf("%s",a.c_str());//或者printf("%s",a.data());
链接字符串
string a = "abc";
string b = "xxx";
//b.append(a, 1, 2);//将a下标位1 - 下标为2的字符串链接到b上 xxxbc
//b = b+a;//xxxabc
//b.append(4,'a');//将4个a链接到字符串上 xxxaaaa
//b.append("abcd",1,3);//xxxabcd
查找字符串
如果找到了就是返回下标 如果没找到返回的是-1 或者string::npos这两个是等价的
string a = "aba";
string b = "xxx";
b.append(a, 1, 2);//将a下标位1 - 下标为2的字符串链接到b上
cout << a.find('d');//很大的随机值 但是这个又可以与-1相等。。
cout << a.find('a');//0//从左往右找
cout << a.rfind('a');//2//从右往左找
cout << a.find("ba");//1//找到字符串的首位置
cout << a.find("bd");//很大的随机值
if (a.find("bd") == -1)
cout << "没找到";
if (a.find("bd") == string::npos)
cout << "没找到";
找字符串中任意一个字符出现的位置
find_first_of
string a = "nihaoayouhaode";
cout<<a.find_first_of("you");//4
//返回的是4 并不是7 他找的不是you第一次出现的位置 而是you这三个字母中任意一个出现的位置
find_first_not_of
就是找这个字符串中没有出现的第一个位置
find_last_of和find_last_not_of
从右向左找
替换字符串
string a = “xxxxxxxx”;
a.replace(1,4,“abcd”);//将字符串下标为1-4的字符串替换为abcd
他是直接替换掉
如果是
a.replace(1,6,“a”);//xax
a.replace(1,100,“a”);//xa
a.replace(1,4,“abcderetx”,2,5);//将字符串下标为1-4的字符串替换为abcderetx中的下标为2-5的字符
删除字符串
a.erase(1,4);//删除下标为1-4的
a.erase(1);//删除下标1和1以后的字符串
自己写对字符的分割
vector<string>Split(const string&s,const string c)
{
vector<string>res;
/*pos1最开始是其实位置 后面是上一个空格的位置 pos2是当前空格的位置
反正核心就是找空格 然后双指针确定滑动窗口*/
int pos1=0,pos2=s.find_first_of(c);//找到第一个空格的位置
while(pos2!=string::npos)
{
if(pos2!=pos1)//只要不是两个位置相同
res.push_back(s.substr(pos1,pos2-pos1));//就将空格之前的这个字符串放进去
pos1=pos2+1;//将要找的位置放到字符串之后
pos2=s.find_first_of(c,pos1);//再找空格的位置
}
if(pos1!=s.size()){
res.push_back(s.substr(pos1));
}
return res;
}
vector<string> a = Split(s," ");//就可以对空格进行分割到数组中
stringstream(流)
头文件
#include <sstream>
用法
stringstream a;
/*赋值*/
a << "sadfd"<<"s ";
cout << a.str();//sadfds
/*清空*/
a.str("");
/*转为整型*/
int b;
a << "234";
a >> b;
cout << b;//234
string干货视频
关于string的理论
string的本质是什么
string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器
本质上是一个动态char数组
char的取值范围为什么是-128-127
等比数列求和公式:
我们计算的是signed char 因为char占一个字节(八位)最高位是符号位
那么就是七位为数据位
先计算最高位
由于计算机存储数据是按补码存储 正数的补码是本身
总和是:20+21…+26
S7 = 1*(1-27)/(1-2) = 27 - 1 = 128-1 = 127
计算最低位
由于我们要计算的是补码(源码取反再+1)
我们知道
最高位127的原码是01111111
按道理来说的最低位-127的原码是11111111 反码->1 0 0 0 0 0 0 1
但是我们会发现 当-127再-1 得到的是
源码:10000000 反码->11111111 补码->1 0 0 0 0 0 0 0
并不是00000000(这个才是0的补码)
那么如果我们将10000000和00000000都算做0的话 就存在二义性了 当你打出0的时候计算机并不知道该用哪一个 所以为了解决二义性的问题 将10000000记为-128减少了没必要的二义性
当char存储的数值不在范围-128~127之间?
不管怎么样 如果是char类型就会自动只存储8位字符
比如:
char a = 200
二进制:11001000
原码:00000000 11001000(最高位是符号位)因为要么8位要么16位 超过8位自动补满16位
补码:00000000 11001000
那么因为是char类型 直接截断8位:11001000(补码)
将补码转换回原码
反码:11000111
原码:10111000(最高位是符号位)0111000是56
十进制:-56
如果你写一个这样的程序
char a = -128;
while (a<130)
{
printf("%d\n", a);
a++;
}
这个程序将死循环 因为a永远都不会超过128 当127再+1结果是-128无限循环下去