当前位置: 首页 > news >正文

【算法入门】字符串基础

在这里插入图片描述

目录

  • 一.字符串引言
  • 1.字符串基础
    • 二.洛谷P5734详解
      • 1.字符串相关库函数
          • 💫(1) strcpy函数 💫
          • 💫(2) strcat函数 💫
          • 💫(3)strstr函数 💫
      • 2.题目讲解

一.字符串引言

1.字符串基础

字符串通常以\0作为结束标志,\0的ASCll码值为0,计算字符串长度时会忽略斜杠零。

二.洛谷P5734详解

1.字符串相关库函数

在讲解题目之前我们先介绍几个关于字符串操作常用的几个库函数

💫(1) strcpy函数 💫

strcpy也叫 拷贝函数 ,头文件为 string.h ,顾名思义它可以将一个字符串数组的内容拷贝到另一个数组中。
strcpy函数原型为:

char *strcat(char *dest, const char *src)

下面通过一段代码演示它的效果:

#include <stdio.h>
#include <string.h>int main()
{char ch[20] = "helloworld";char arr[10] = "xxxxxx";printf("%s", strcpy(ch, arr));return 0;
}

因为strcpy函数的返回值是拷贝后数组的地址,所以可以通过链式访问在屏幕上打印出xxxxxx,还需要注意的是拷贝函数目的数组要留够拷贝的空间不然程序会崩溃。

💫(2) strcat函数 💫

strcat函数称为追加拷贝函数 ,头文件为头文件为 string.h
strcat函数原型为:

char *strcat(char *dest, const char *src)

strcat可以找到目标数组的结束标志\0,并用起始数组代替\0。
我们还是用代码来演示他的效果:

#include <stdio.h>
#include <string.h>int main()
{char ch[15] = "likou";char arr[10] = "luogu";printf("%s", strcat(ch, arr));return 0;
}

结果:
在这里插入图片描述
这个函数同样需要在目标数组开辟足够的空间,才能 正常追加拷贝

💫(3)strstr函数 💫

strstr函数是字符串查找函数,文件为头文件为 string.h
函数原型为:

char *strstr( const char *arr1, const char *arr2 );

strstr函数可以在arr1数组中查找是否存在arr2数组中的内容,如果存在返回首次出现的地址,不存在则返回空指针 NULL
下面用代码来演示下它的效果:
在这里插入图片描述

以上将几个要用得字符串函数讲解了,接下来我们看题目。

2.题目讲解

  • 我们先来看一下题目:
    在这里插入图片描述
    分析: 题目考察了四个字符串的操作,只要我们掌握以上几个函数,还有熟练运用 数组下标 和字符串的 结束标志 即可。
    逻辑分析与代码编写:

我们先根据题目写出整体的逻辑:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <iostream>using namespace std;char ch[110];
char in[110];int main()
{int count;cin >> count;cin >> ch;while (count--){int input;scanf("%d", &input);if (input == 1){}else if (input == 2){	}else if (input == 3){}else{}}return 0;
}

代码实现:

  1. 我们先实现第一个操作:在文档后插入字符串并输出,显然要用到追加拷贝函数strcat,如下:
if (input == 1){cin >> in;strcat(ch, in);cout << ch << endl;}
  1. 第二步,截取文档从第 a 个字符起 b 个字符输出,只需要在数组第a+b的位置赋为\0在运用拷贝函数操作即可,代码送上 体会一下:
else if (input == 2){int start;int end;scanf("%d %d", &start, &end);char in[110] = { 0 };ch[start + end] = '\0';strcat(in, &ch[start]);strcpy(ch, in);cout << ch << endl;}

因为在上一步操作中对in数组进行了输入,所以这里在使用in数组之前应该将in数组中的元素释放出来。

  1. 第三步,插入片段,在文档中第 a 个(有歧义,是数组下标)字符前面插入字符串,并输出文档的字符串。代码如下:
	else if (input == 3){int cur;scanf("%d", &cur);cin >> in;strcat(in, &ch[cur]);ch[cur] = '\0';strcat(ch, in);printf("%s\n", ch);}

上图代码逻辑雀氏妙,大家仔细体会。

  1. 最后一步:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1。通过观察示例所知,若存在返回的是下标而不是内存地址(返回下标我们可以使用指针减指针的方式实现),显然这里需要用来strstr函数
else{cin >> in;char* ret=strstr(ch, in);printf("%d\n", ret != NULL ? (int)(ret-ch) : -1);}

这样用三目操作符 没想到吧?
在这里插入图片描述


下面完整代码奉上:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <iostream>using namespace std;char ch[110];
char in[110];int main()
{int count;cin >> count;cin >> ch;while (count--){int input;scanf("%d", &input);if (input == 1){cin >> in;strcat(ch, in);cout << ch << endl;}else if (input == 2){int start;int end;scanf("%d %d", &start, &end);char in[110] = { 0 };ch[start + end] = '\0';strcat(in, &ch[start]);strcpy(ch, in);cout << ch << endl;}else if (input == 3){int cur;scanf("%d", &cur);cin >> in;strcat(in, &ch[cur]);ch[cur] = '\0';strcat(ch, in);printf("%s\n", ch);}else{cin >> in;char* ret = strstr(ch, in);printf("%d\n", ret != NULL ? (int)(ret - ch) : -1);/*if (NULL == ret)cout << -1 << endl;elsecout << ret - ch << endl;*/}}return 0;
}

在源码中可以发现我注释了几处释放in数组的操作,其实我当时在疑惑多次对in数组输入,为什么不需要在下一次之前将in的元素释放掉。真相是 即使数组中保留着上一次输入的字符串 scanf再次输入时 会在字符串后自动补上\0保证上一次的元素无法影响输出(在不越界的情况下)

以上就是这次的全部内容。

感谢阅读,共同进步

相关文章:

【算法入门】字符串基础

目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数&#x1f4ab;&#xff08;1&#xff09; strcpy函数 &#x1f4ab;&#x1f4ab;&#xff08;2&#xff09; strcat函数 &#x1f4ab;&#x1f4ab;&#xff08;3&#xff09;strstr函数 &#x1f4ab;2.题…...

前端面试题 —— 浏览器原理(二)

目录 一、有哪些可能引起前端安全的问题? 二、网络劫持有哪几种&#xff0c;如何防范&#xff1f; 三、浏览器渲染进程的线程有哪些 四、僵尸进程和孤儿进程是什么&#xff1f; 五、为什么需要浏览器缓存&#xff1f; 六、对浏览器的理解 七、CSS 如何阻塞文档解析&…...

对于植物神经紊乱的治疗 中医采用辩证论治的方法

植物神经紊乱是由于心理压力过大、长期生活不规律所导致的一种疾病&#xff0c;这种疾病的发生往往是症状多样、涉及广泛的。当患有植物神经紊乱之后&#xff0c;主要的症状会以躯体化障碍为常见症状&#xff0c;但是很多患者还会出现情绪失控、睡眠障碍等问题。 对于植物神经紊…...

chatGPT之Python API启用上下文管理

chatGPT已经爆火一段时间了&#xff0c;我想大多数的开发者都在默默的在开发和测试当中&#xff0c;可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。为什么别人的机器人能联想之前的语料&#xff0c;而你的却像个每次都只如初见的高冷机器人&…...

油田钻井实时在线监测系统

油田钻井的井下油层的压力不断变化&#xff0c;环境深度和压力巨大&#xff0c;且井下原油具有一定的流动性&#xff0c;实时在线压力监测是石油开采行业的难点。为更好地了解油田开采过程中油层的状况&#xff0c;提高油田开采效率和产量&#xff0c;油田钻井实时在线监测系统…...

经典PID控制算法原理以及优化思路

文章目录0、概念1、理解2、实现3、优化4、引用0、概念 PID算法是工业应用中最广泛算法之一&#xff0c;在闭环系统的控制中&#xff0c;可自动对控制系统进行准确且迅速的校正。PID控制&#xff0c;即Proportional – Integral(I) – Derivative(D) Control, 实际上是三种反馈…...

经典面试题之赋值和深浅拷贝的区别

1.区别 **赋值&#xff1a;**基本数据直接拷贝&#xff0c;互不影响&#xff0c;引用数据把地址赋值给新对象&#xff0c;新旧对象指向同一个地址。 **浅拷贝: **基本类型之间互不影响&#xff0c;对象只会复制对象的第一层基本数据和引用类型的地址&#xff0c;对象内部嵌套的…...

电子取证的电脑配置有关问题,以我仅有的知识为大家建议一下。

电子取证火力很重要&#xff0c;用轻薄本是没法取证的&#xff0c;所以至少是全能本或者是游戏本&#xff0c;牛逼的选手上台式&#xff0c;参考浙警许专家&#xff0c;yyds我专家&#xff01; 我从实战出发&#xff0c;参考历年“美亚杯”和“长安杯”比赛&#xff0c;给大家…...

【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)

文章目录前言环形链表环形链表 II写在最后前言 本章的OJ练习相对于OJ练习(4)较为简单。不过&#xff0c;本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。 对于OJ练习(4)&#xff1a;-> 传送门 <-&#xff0c;分割链表以一种类似于归并的思想解得&a…...

MySQL 基础教程[13]

MySQL 基础教程[13]问题1问题1代码问题2问题2代码本系列MySQL 基础教程通过“问题-代码”的方式介绍各类方法&#xff0c;每篇设置2个MySQL综合问题&#xff0c;并给出解决方案。 问题1 kwgl数据库中有学生基本信息表student和系别表dept。表结构及说明如下: student (sid, s…...

个人练习-Leetcode-826. Most Profit Assigning Work

题目链接&#xff1a;https://leetcode.cn/problems/most-profit-assigning-work/ 题目大意&#xff1a;给出一串任务&#xff0c;difficulty表示任务难度&#xff0c;profit表示任务的收益&#xff08;以下简称diff和pro&#xff09;。给出一串工人的能力worker。每个工人只能…...

云原生周刊:边缘计算会吞噬云吗?| 2023.3.13

文章推荐 边缘计算吞噬云&#xff1f; 这篇文章讨论了边缘计算对传统云计算的潜在冲击。 边缘计算是一种新型的计算架构&#xff0c;它将计算移动到离数据源和终端设备更近的地方&#xff0c;从而提供更快的响应时间和更好的用户体验。相比之下&#xff0c;云计算是一种集中…...

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的&#xff0c;要将所有的功能模块都一一列举出来&#xff0c;然后进行逐个的功能设计&#xff0c;使得每一个模块都有相对应的功能设计&#xff0c;然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…...

经典文献阅读之--LIO-PPF(增量平面预拟合LIO)

0. 简介 自从ikd-tree出来后&#xff0c;现在越来越多的工作瞄准了增量式这种方法&#xff0c;比如说激光惯导里程计&#xff08;LIDAR-Inertial Odometry&#xff0c;LIO&#xff09;的高精度跟踪通常涉及最小化点到平面距离的k最近邻&#xff08;kNN&#xff09;搜索&#x…...

ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟

目录1 ChatGPT的时代2 CSIG企业行3 议题&嘉宾介绍3.1 对生成式人工智能的思考3.2 对话式大型语言模型研究3.3 文档图像处理中的底层视觉技术4 观看入口1 ChatGPT的时代 2015年&#xff0c;马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始…...

C#基础之面向对象编程(二)

总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…...

蓝桥杯刷题冲刺 | 倒计时25天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.完全二叉树1.完全二叉树 题目 链接&#xff1a; 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 给…...

c语言—动态内存管理

一.为什么存在动态内存开辟开辟空间的特点&#xff1a;空间开辟大小是固定的数组在申明时&#xff0c;必须指定数组长度&#xff0c;她所需要的内存在编译时分配但是对于空间的需求&#xff0c;不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道&#xff…...

请说明Ajax、Fetch、Axios三者的区别

相同点&#xff1a; 1、三者都用于网络请求&#xff0c;但是不同维度 2、 Ajax(Asynchronous Javascript and XML)&#xff0c;一种技术的统称&#xff0c;并不是实际的API 3、Fetch是一个具体的API&#xff0c;浏览器里面直接有一个API就叫Fetch 4、 Axios是一个第三方库&…...

阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…...

【Unity】数据持久化路径Application.persistentDataPath

今天突然想到这个路径Application.persistentDataPath&#xff0c;热更的重要路径&#xff0c;该文件夹可读可写&#xff0c;在移动端唯一一个可读写操作的文件夹。移动端可以将本地的资源&#xff08;资源MD5值配置表&#xff09;等一些文件放到StreamingAssets文件夹下&#…...

华为OD机试 - 插队(Java JS Python)

题目描述 某银行将客户分为了若干个优先级, 1 级最高, 5 级最低,当你需要在银行办理业务时,优先级高的人随时可以插队到优先级低的人的前面。 现在给出一个人员到来和银行办理业务的时间序列,请你在每次银行办理业务时输出客户的编号。 如果同时有多位优先级相同且最高…...

MongoDB数据库从入门到精通系列之八:调整oplog大小

MongoDB数据库从入门到精通系列之八:调整oplog大小 一、oplog的概念二、oplog大小三、调整oplog大小详细步骤一、oplog的概念 操作日志oplog包含了主节点执行的每一次写操作。oplog是存在于主节点local数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。每个…...

PCL 间接平差法拟合二维直线

目录 一、算法原理二、代码实现三、结果展示四、相关链接一、算法原理 通过传统最小二乘法对点云数据进行二维直线拟合时,可将误差只归因于一个方向上,本文假设误差只存在于 y y y轴方向上,设点云拟合的二维直线方程为: y =...

进程调度的基本过程

这里写目录标题什么是进程进程管理结构体或类的主要属性pid内存指针文件描述符表辅助进程调度的属性并发并行并发什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;也就是说&#xff0c;一个运行起来的程序就是一个进程。 进程又是操作系统进行资源分配的…...

python自动化办公(二)

上接python自动化办公&#xff08;一&#xff09; 文章目录文件和目录操作使用shutil库文件查找globfnmatchhashlib文件和目录操作 使用shutil库 shutil库也是Python标准库&#xff0c;它可以处理文件、文件夹、压缩包&#xff0c;能实现文件复制、移动、压缩、解压缩等功能。…...

Qt Quick - GridLayout 网格布局

GridLayout 理论总结一、概述二、依赖属性三、例子1. 不含跨行的2. 带跨行列的3. 从右到左一、概述 GridLayout 是最常用的布局器&#xff0c;也叫网格布局器&#xff0c;如果网格布局被调整大小&#xff0c;布局中的所有 Item 将被重新排列。它类似于基于widget的QGridLayout…...

安卓手机也可以使用新必应NewBing

没有魔法安卓手机也可以使用新必应NewBing 目前知道的是安卓手机 安卓手机先安装一个猴狐浏览器 打开手机自带浏览器&#xff0c;搜索关键词&#xff1a;猴狐浏览器&#xff0c;找到官网 也可以直接复制这个网址 狐猴浏览器 lemurbrowser CoolAPK 我的手机是荣耀安卓手机…...

支付系统设计:消息重试组件封装

文章目录前言一、重试场景分析一、如何实现重试1. 扫表2. 基于中间件自身特性3. 基于框架4. 根据公司业务特性自己实现的重试二、重试组件封装1. 需求分析2. 模块设计2.1 持久化模块1. 表定义2. 持久化接口定义3. 持久化配置类2.2 重试模块1.启动2.重试3. 业务端使用1. 引入依赖…...

Visual Studio 2022 c#中很实用的VS默认快捷键和原生功能

常常使用VS感觉还是有必要掌握其默认的快捷键&#xff0c;我这个人比较懒&#xff0c;不喜欢动不动就去设置快捷键&#xff0c;系统有就用&#xff0c;记住了就可以到处用&#xff0c;问题是像我们这种有很多个工作场所的人不可能每台电脑都去配置一下快键键。实际上我使用3dma…...

织梦网站修改教程/搜索引擎收录提交入口

随着WiFi的普及&#xff0c;越来越多的人开始使用无线路由器进行无线上网&#xff0c;比如笔记本电脑&#xff0c;智能手机都可以共享一个路由器进行上网&#xff0c;有时候&#xff0c;我们在用笔记本进行无线WiFi上网的时候&#xff0c;电脑右下角的无线连接图标明明显示连接…...

太仓做网站公司/泉州关键词排名

问题描述搜索输入框中&#xff0c;只当用户停止输入后&#xff0c;才进行后续的操作&#xff0c;比如发起Http请求等。学过电子电路的同学应该知道按键防抖。原理是一样的&#xff1a;就是说当调用动作n毫秒后&#xff0c;才会执行该动作&#xff0c;若在这n毫秒内又调用此动作…...

宜春网站建设哪家专业/义乌最好的电商培训学校

原文地址&#xff1a;http://www.tuicool.com/articles/MzeM7r 本博文少许理论资料来至DBA技术大牛 http://blog.csdn.net/tianlesoftware/article/details/4717318 &#xff0c;本着实践式学习&#xff0c;书写以下博文&#xff1a; 一、什么是分区表 Oracle提供了分区技…...

浏览器做单页网站项目/百度排名优化工具

安装 Linux 主机时,如果选择 最小化安装! 配置 vnc 远程桌面可以参考:Linux 配置 VNC 远程桌面 使用 vnc 等工具连接通常显示如下: 也就是无法使用图形化界面,可以通过 yum 直接安装图形化界面: Linux 6: yum groupinstall -y "X Window System" yum gr…...

网站改版 请示/网址提交入口

部署在linux上的java程序&#xff0c;有时更新了包&#xff0c;忘记了是否执行了重启&#xff0c;此时有必要根据java进程的启动时间和包的更新时间来确定。 1. 查看Linux进程的启动时间 # ps axo pid,ppid,comm,pmem,lstartPID PPID COMMAND %MEM …...

wordpress去除无用标签/百度怎么搜索关键词

在使用FTP向服务器传送问文件的时候&#xff0c;要注意选择传输模式&#xff0c;如果服务器用的是linux,那么一定要选二进制模式,否则传送文件的时候会出错转载于:https://blog.51cto.com/wll2015/1655774...