(纯干货建议收藏)大型字符串模拟-超强超全函数技巧总结

news2024/12/23 18:35:10

这篇文章将会总结一些处理字符串、进制转换等等的常见的、非常有用的技巧和函数。后续会随时更新本文章,希望大家收藏、留言,一起学习进步!

对于特别简单的函数,就不写函数的详细原型啦!

具体包含四部分,可以根据目录去寻找:
1.char*函数       2.string函数    3.数符转换和进制转换  4.字符串函数优化(kmp替换string find,字符串哈希部分替换string substr)

5.位运算技巧 

6.按空格分割字符串

目录

char*函数

strlen函数:

strcmp函数:

strcat函数:

strcpy函数:

memset函数:

cin.getline函数:

读取char*时的下标问题

char*转string

string函数

size/length函数

push_back()与insert()函数

compare函数/append函数

erase函数

replace函数

string转char*

find函数

substr函数

数符转换和进制转换

sprintf函数

itoa/atoi

进制转换补充

字符串函数优化

位运算技巧

字符串按空格分割


char*函数

strlen函数:

求一个char数组的长度,<cstring>

char str[10]
scanf("%s",str);
int len=strlen(str);
cout<<len<<endl;

strcmp函数:

比较两个char数组的字典序,<cstring>

char a[6]="a"
char b[6]="ab"
char c[6]="ac"
cout<<strcmp(a,b)<<endl;//-1
cout<<strcmp(c,b)<<endl;//1
cout<<strcmp(a,a)<<endl;//0

strcat函数:

连接两个char数组,<cstring>

char a[6]="ab"
char b[6]="bc"
strcat(a,b)
cout<<a<<endl;//abbc
cout<<b<<endl;//bc

strcpy函数:

把一个char数组复制到另一个上面,<cstring>

char a[6]="ab"
char b[6]="bc"
strcpy(a,b)
cout<<a<<endl;//bc
cout<<b<<endl;//bc

memset函数:

初始化数组,<cstring>  int数组也可以用

char a[100];
memset(a,'0',sizeof a);

cin.getline函数:

读取一行字符,包括空格,遇到换行符终止,丢弃换行符,<istream>

第一个参数:数组名,第二个参数:最多输入的字符数(注意字符串后面有一个空字符,所以一般这个参数比实际最大长度多1,比如读取abcd就写5)

int a[100];
cin.getline(a,100);//最多输入99个字符,即(0,99);
cout<<a;

还有cin.get函数可以读取一行,但是对于读取一行的函数就掌握getline就够用了!比如下面这段代码换成get就会出问题


while(n--)
{
	char a[100];
	cin.getline(a,100)//最多输入99个字符,即(0,99);
	cout<<a<<endl;
}

读取char*时的下标问题

如果想让读取到的char*下标从1开始,cin,scanf,getline都支持下面这种写法,string就不支持

    char a[10];
//	cin>>a+1;
//	scanf("%s",a+1);
	cin.getline(a+1,10);
	cout<<a[1];
	return 0;

char*转string

方法非常简单,直接让一个char*赋值给string即可

char a[100]="anc";
string b=a;
cout<<b<<endl;//anc

string函数

包含STL神器之一:string 的各种常用函数,头文件皆为<string>

size/length函数

返回string长度

string a="123";
cout<<a.size()<<endl;//3
cout<<a.length()<<endl;//3

push_back()与insert()函数

前者:向字符串尾端插入一个字符

后者:下面展示常用的,当然还有别的方法,只不过可以由最基本的转换而来

string a="123";
string b="56";
char c='7';
a.push_back('4');
cout<<a<<endl;//1234
a.insert(a.begin(),b);//不合法
a.insert(0,b);//合法,a="123456"
a.insert(a.begin(),c);//合法,a="1234567"

compare函数/append函数

建议直接用< > == 和 +=符号替代

erase函数

常用来删除一个区间内的字符,区间左闭右开

string str="123456";
str.erase(1,4);
cout<<str<<end;//156

replace函数

常用来把str的某一个区间替换成重复的单个字符或者整个其它字符串

下面展示几种常用的写法

string a="123456";
string b="789";
char c='0'
a.replace(0,5,b);//a="7896"  把a的[0,5)变成b
a.replace(0,2,3,c);//a="00096"   把a从下标0开始往后的2个字符替换成3个字符c

string转char*

直接用c_str()即可

char a[100];
string b="123";
a=b.c_str();
//也可以这样:scanf("%s",b.c_str());

find函数

模式匹配函数,直接放例子,通俗易懂

string a="123123";
cout<<a.find('1')<<endl;//0
cout<<a.find('1',2)<<endl;//3  因为是从下标2往后找

substr函数

str.substr(pos,length)从pos开始往后截取长度为length的子串并返回

string a="1234";
string b=a.substr(2,2);//b="34"

数符转换和进制转换

本部分将会介绍整型和字符串常用的转换方法,由于这个转换常常可以伴随进制转换,所以放在一起总结,这也是字符串模拟题目中常常考察的技能!!!

sprintf函数

把一个格式化字符串,写入字符数组,返回写入数组的总字符数,如果失败,返回负数

举例:

char a[100];
int b=5;
sprintf(a,"1234%d",b);//a="12345"

itoa/atoi

itoa用于将十进制整数变为任意进制的字符数组形式

atoi用于将字符数组变为十进制整数(不支持类型转换)

详见:atoi itoa简介

进制转换补充

看到这里,可能会问:那如何把a进制整数转为b进制整数呢?答案是c++没有这个库函数,所以需要自己写一个函数,先把a进制转10进制,再把10进制转b进制

同理,c++也没有把一个a进制字符串变为十进制整数的函数,需要麻烦自己写了

字符串函数优化

find函数虽然好用,但是时间上不如kmp算法,所以当写一个题目用findTLE的使用,换成kmp吧,下面是acwing算法基础课的kmp板子:

#include <iostream>
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
    cin >> n >> p + 1 >> m >> s + 1;
    for (int i = 2, j = 0; i <= n; i ++ )
    {
        while (j && p[i] != p[j + 1]) j = ne[j];
        if (p[i] == p[j + 1]) j ++ ;
        ne[i] = j;
    }
    for (int i = 1, j = 0; i <= m; i ++ )
    {
        while (j && s[i] != p[j + 1]) j = ne[j];
        if (s[i] == p[j + 1]) j ++ ;
        if (j == n)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }
    return 0;
}

再来说substr,比如下面这种题(来自acwing算法基础课),第一反应可能是用substr,但可能会TLE

所以在此放一下acwing算法基础课字符串哈希的板子,大家触类旁通,在某种情况下可以参考

#include<iostream>
using namespace std;
const int N=100010,P=131;
typedef unsigned long long ULL;
char str[N];
ULL p[N],h[N];
ULL get(int l,int r)
{
    return h[r]-h[l-1]*p[r-l+1];
}
int main()
{
    int n,m;
    cin>>n>>m;
    getchar();
    for(int i=1;i<=n;i++)scanf("%c",&str[i]);
    p[0]=1;
    for(int i=1;i<=n;i++)
    {
        h[i]=h[i-1]*P+str[i];
        p[i]=p[i-1]*P;
    }
    while(m--)
    {
        int l1,r1,l2,r2;
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        if(get(l1,r1)==get(l2,r2))cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

位运算技巧

对于二进制字符串模拟这种题,比如csp第30次认证第3题,很多时候用到位运算的技巧。下面是链接

csp30次认证第3题

x&-x:可以求x最低位的一个1出现在哪一位

比如100011算完就是000001

10010算完就是00010

a>>b&1:检查a的第b位(最低位是0)是否为1

a&1==1:奇数

a&1==0:偶数

二进制“拼接”:

比如两个二进制数100和010想变成100010,只需让100左移3然后加上010即可

二进制“截取”:

比如10101想求中间的三位数“010”,首先令a=10101   a>>=1  b=1<<3  c=a-b c即为答案

~i:判断i是否为0

由此可以发现如果可以灵活使用位运算,很多时候处理二进制数的时候可以迎刃而解

字符串按空格分割

像第三次ccfcsp的第三题:csp3次认证第3题就会常常用到这种分割技巧,方法在之前的文章中已经讲过,给出连接如下:

stringstream字符串分割、字符串拼接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xilinx FPGA未使用管脚上下拉状态配置(ISE和Vivado环境)

文章目录 ISE开发环境Vivado开发环境方式1&#xff1a;XDC文件约束方式2&#xff1a;生成选项配置 ISE开发环境 ISE开发环境&#xff0c;可在如下Bit流文件生成选项中配置。 右键点击Generate Programming File&#xff0c;选择Process Properties&#xff0c; 在弹出的窗口选…

《程序员职场工具库》如何优化你的工作 —— PDCA 循环

PDCA 循环简介 PDCA 循环是一种以持续改进为核心思想的管理方法&#xff0c;在全球各个领域得到广泛的应用。它还有好几个别称&#xff0c;叫“质量环”&#xff0c;也叫“戴明环”&#xff0c;也有叫“持续改进螺旋”。 PDCA 循环由四个步骤组成&#xff1a; 计划&#xff…

基于SSM+Vue的中国咖啡文化宣传网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用vUE技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

vector模拟实现——关于模拟中的易错点

前言 vector 本质上类似数组&#xff0c;也可以理解为一种泛型的 string。string 只能存储 char 类型&#xff0c;但是 vector 支持各种内置类型和自定义类型。本次将围绕模拟实现 vector 中遇到的问题进行分析。 文章目录 前言一、确定思路二、实现过程2.1 查阅文档2.2 验证…

4-3 nn.functional和nn.Module

一&#xff0c;nn.functional 和 nn.Module 前面我们介绍了Pytorch的张量的结构操作和数学运算中的一些常用API。利用这些张量的API我们可以构建出神经网络相关的组件(如激活函数&#xff0c;模型层&#xff0c;损失函数)。 其实&#xff1a;Pytorch和神经网络相关的功能组件大…

中小企业数字化转型难?为什么不试试“企业级”无代码平台

首先&#xff0c;让我们思考一下&#xff0c;中小企业为什么要进行数字化转型&#xff1f;随着全球经济的数字化趋势日益明显&#xff0c;中小企业作为经济的重要组成部分&#xff0c;其数字化转型已成为推动经济高质量发展的关键。数字技术可以帮助中小企业提高生产效率、降低…

ctfshow-web-红包题 辟邪剑谱

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库溯源相关 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 这道题主要是考察mysql查询绕过的问题。 首先访问后看到是一个登录页面&#xff0c;测试注册等无果 扫描目录&#xff0c;发…

Packet Tracer的使用介绍

直接访问 Packet Tracer 的帮助页面、教程视频和在线资源对于了解该软件会更加方便。 单击菜单工具栏右上角的问号图标。单击“帮助”菜单&#xff0c;然后选择“内容”。 b. 通过单击“帮助”>“教程”来访问 Packet Tracer 的教程视频。 菜单栏&#xff1a;提供文件、编辑…

SpringBoot运行原理

目录 SpringBootApplication ComponentScan SpringBootConfiguration EnableAutoConfiguration 结论 SpringbootApplication&#xff08;主入口&#xff09; SpringBootApplication public class SpringbootConfigApplication {public static void main(String[] args) {…

Android动态片段

之前创建的片段都是静态的。一旦显示片段&#xff0c;片段的内容就不能改变了。尽管可以用一个新实例完全取代所显示的片段&#xff0c;但是并不能更新片段本身的内容。 之前已经创建过一个基础秒表应用&#xff0c;具体代码https://github.com/MADMAX110/Stopwatch。我们将这个…

发生以下的报错怎么办?

报错问题&#xff1a; 解决办法&#xff1a; 根据你提供的代码和错误信息&#xff0c;问题出在使用了nullptr。这个错误是因为你的编译器不支持C11标准。 nullptr是C11引入的空指针常量。为了解决这个问题&#xff0c;你可以尝试以下两种方法之一&#xff1a; 1. 将nullptr…

想要精通算法和SQL的成长之路 - 可以攻击国王的皇后

想要精通算法和SQL的成长之路 - 可以攻击国王的皇后 前言一. 可以攻击国王的皇后 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 可以攻击国王的皇后 原题链接 这个题目其实并没有涉及到什么很难的算法&#xff0c;其实就是一个简单的遍历题目。核心思想&#xff1a; 以…

CRM系统销售自动化功能如何提高销售效率

销售效率对企业的盈利能力有着至关重要的联系。提高销售效率&#xff0c;就是要提高销售人员的工作效率和销售转化率。那么&#xff0c;企业如何提高销售效率呢&#xff1f;CRM销售自动化功能可以帮助企业实现这一目标。 一、线索管理 线索是指有潜在购买意向的客户&#xff…

kali必杀器之三剑客

Kali常见攻击手段 注意:仅用于教程和科普&#xff0c;切勿做违法之事&#xff0c;否则后果自负 1 网络攻击手段 请正确使用DDos和CC攻击&#xff0c;不要用来做违反当地法律法规的事情&#xff0c;否则后果自负 使用之前kali需要能够上网 参考:kali安装 1.1 DDos攻击…

新加坡打车软件平台Ryde Group申请1700万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;新加坡打车软件平台Ryde Group近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;RYDE&#xff09;&#x…

学习javaEE初阶的第一堂课

学习金字塔 java发展简史 Java最初诞生的时候是用来写前端的!! 199x年 199x年,互联网还处在比较早期的阶段,当时主流的编程语言是 C/C, 有个大佬要搞个"智能面包机",觉得用C来做太难了 于是就基于C搞了个简单点的语言,Java 就诞生了~~ 遗憾的是项目流产了,没做成…

【SpringMVC】自定义注解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Spring MVC》。&#x1f3…

MMrotate_dev 1.x训练自己的数据集

因为MMRotate dev 1.x 新增了PSC角度编码器以及RTMDet目标检测算法&#xff0c;而之前从官网下载的MMRotate是main分支&#xff0c;没有新增的东西&#xff0c;所以重新搞了一下&#xff0c;以此记录。 环境配置 1.创建虚拟环境 注意&#xff1a;如果之前安装了MMRotate的其…

基于小程序的理发店预约系统

一、项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率&#xff0c;给人们带来很多的方便。计算机技术从很大的程度上解放了人们的双手&#xff0c;并扩大了人们的活动范围&#xff0c;是人们足不出户就可以通过电脑进行各种事情的管理。信息系…

pycharm安装jupyter,用德古拉主题,但是输入行全白了,看不清,怎么办?

问题描述 今天换了以下pycharm主题&#xff0c;但是jupyter界面输入代码行太白了&#xff0c;白到看不清楚这行的字&#xff0c;更不知道写的是什么&#xff0c;写到哪了&#xff0c;这还是挺烦人的&#xff0c;其他都挺正常的。 问题分析 目前来看有两个原因&#xff1a; 1、…