【算法入门】字符串基础

目录
- 一.字符串引言
- 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;
}
代码实现:
- 我们先实现第一个操作:在文档后插入字符串并输出,显然要用到追加拷贝函数strcat,如下:
if (input == 1){cin >> in;strcat(ch, in);cout << ch << endl;}
- 第二步,截取文档从第 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数组中的元素释放出来。
- 第三步,插入片段,在文档中第 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);}
上图代码逻辑雀氏妙,大家仔细体会。
- 最后一步:查找子串,查找字符串 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.字符串相关库函数💫(1) strcpy函数 💫💫(2) strcat函数 💫💫(3)strstr函数 💫2.题…...
前端面试题 —— 浏览器原理(二)
目录 一、有哪些可能引起前端安全的问题? 二、网络劫持有哪几种,如何防范? 三、浏览器渲染进程的线程有哪些 四、僵尸进程和孤儿进程是什么? 五、为什么需要浏览器缓存? 六、对浏览器的理解 七、CSS 如何阻塞文档解析&…...
对于植物神经紊乱的治疗 中医采用辩证论治的方法
植物神经紊乱是由于心理压力过大、长期生活不规律所导致的一种疾病,这种疾病的发生往往是症状多样、涉及广泛的。当患有植物神经紊乱之后,主要的症状会以躯体化障碍为常见症状,但是很多患者还会出现情绪失控、睡眠障碍等问题。 对于植物神经紊…...
chatGPT之Python API启用上下文管理
chatGPT已经爆火一段时间了,我想大多数的开发者都在默默的在开发和测试当中,可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。为什么别人的机器人能联想之前的语料,而你的却像个每次都只如初见的高冷机器人&…...
油田钻井实时在线监测系统
油田钻井的井下油层的压力不断变化,环境深度和压力巨大,且井下原油具有一定的流动性,实时在线压力监测是石油开采行业的难点。为更好地了解油田开采过程中油层的状况,提高油田开采效率和产量,油田钻井实时在线监测系统…...
经典PID控制算法原理以及优化思路
文章目录0、概念1、理解2、实现3、优化4、引用0、概念 PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID控制,即Proportional – Integral(I) – Derivative(D) Control, 实际上是三种反馈…...
经典面试题之赋值和深浅拷贝的区别
1.区别 **赋值:**基本数据直接拷贝,互不影响,引用数据把地址赋值给新对象,新旧对象指向同一个地址。 **浅拷贝: **基本类型之间互不影响,对象只会复制对象的第一层基本数据和引用类型的地址,对象内部嵌套的…...
电子取证的电脑配置有关问题,以我仅有的知识为大家建议一下。
电子取证火力很重要,用轻薄本是没法取证的,所以至少是全能本或者是游戏本,牛逼的选手上台式,参考浙警许专家,yyds我专家! 我从实战出发,参考历年“美亚杯”和“长安杯”比赛,给大家…...
【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)
文章目录前言环形链表环形链表 II写在最后前言 本章的OJ练习相对于OJ练习(4)较为简单。不过,本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。 对于OJ练习(4):-> 传送门 <-,分割链表以一种类似于归并的思想解得&a…...
MySQL 基础教程[13]
MySQL 基础教程[13]问题1问题1代码问题2问题2代码本系列MySQL 基础教程通过“问题-代码”的方式介绍各类方法,每篇设置2个MySQL综合问题,并给出解决方案。 问题1 kwgl数据库中有学生基本信息表student和系别表dept。表结构及说明如下: student (sid, s…...
个人练习-Leetcode-826. Most Profit Assigning Work
题目链接:https://leetcode.cn/problems/most-profit-assigning-work/ 题目大意:给出一串任务,difficulty表示任务难度,profit表示任务的收益(以下简称diff和pro)。给出一串工人的能力worker。每个工人只能…...
云原生周刊:边缘计算会吞噬云吗?| 2023.3.13
文章推荐 边缘计算吞噬云? 这篇文章讨论了边缘计算对传统云计算的潜在冲击。 边缘计算是一种新型的计算架构,它将计算移动到离数据源和终端设备更近的地方,从而提供更快的响应时间和更好的用户体验。相比之下,云计算是一种集中…...
python+django+vue图书个性化推荐系统
整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…...
经典文献阅读之--LIO-PPF(增量平面预拟合LIO)
0. 简介 自从ikd-tree出来后,现在越来越多的工作瞄准了增量式这种方法,比如说激光惯导里程计(LIDAR-Inertial Odometry,LIO)的高精度跟踪通常涉及最小化点到平面距离的k最近邻(kNN)搜索&#x…...
ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟
目录1 ChatGPT的时代2 CSIG企业行3 议题&嘉宾介绍3.1 对生成式人工智能的思考3.2 对话式大型语言模型研究3.3 文档图像处理中的底层视觉技术4 观看入口1 ChatGPT的时代 2015年,马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始…...
C#基础之面向对象编程(二)
总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…...
蓝桥杯刷题冲刺 | 倒计时25天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.完全二叉树1.完全二叉树 题目 链接: 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 给…...
c语言—动态内存管理
一.为什么存在动态内存开辟开辟空间的特点:空间开辟大小是固定的数组在申明时,必须指定数组长度,她所需要的内存在编译时分配但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道ÿ…...
请说明Ajax、Fetch、Axios三者的区别
相同点: 1、三者都用于网络请求,但是不同维度 2、 Ajax(Asynchronous Javascript and XML),一种技术的统称,并不是实际的API 3、Fetch是一个具体的API,浏览器里面直接有一个API就叫Fetch 4、 Axios是一个第三方库&…...
阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过
经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
