c++-string

存在返回首字母的位置
未找到返回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干货视频

良心up主

关于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无限循环下去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值