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

【PTA刷题】 求子串(代码+详解)

【PTA刷题】 求子串(代码+详解)

题目

请编写函数,求子串。

函数原型

char* StrMid(char *dst, const char *src, int idx, int len);

说明:函数取源串 src 下标 idx 处开始的 len 个字符,保存到目的串 dst 中,函数值为 dst。若 len 值不正确,则自动修正。若 idx 值不正确,则目的串为空串。

裁判程序

#include <stdio.h>char* StrMid(char *dst, const char *src, int idx, int len);int main()
{char a[128], b[128];int s, n;gets(a);scanf("%d%d", &s, &n);StrMid(b, a, s, n);puts(b);return 0;
}/* 你提交的代码将被嵌在这里 */

输入样例1

abcd
1 2

输出样例1

bc

输入样例2

abcd
1 5

注:5 不正确,按 3 处理。

输出样例2

bcd

输入样例3

abcd
-5 2

输出样例3


注:输出为空串。

代码

char* StrMid(char *dst, const char *src, int idx, int len) {// 检查参数是否合法if (idx < 0) {dst[0] = '\0'; // 如果 idx 不正确,将目的串设为空串} else {int src_len = strlen(src);if (idx >= src_len || len <= 0) {dst[0] = '\0'; // 如果 idx 超出源串长度或 len 不正确,将目的串设为空串} else {// 修正 len,确保不超出源串的长度if (len > src_len - idx) {len = src_len - idx;}// 拷贝子串到目的串strncpy(dst, src + idx, len);dst[len] = '\0'; // 确保目的串以 null 结尾}}

解析

这是一个关于字符串操作的题目,我会逐步解释这个函数的实现细节。这个题目是一个C语言函数,其目的是从源字符串中复制一部分到目标字符串中。

首先,让我们看一下这个函数的原型:

char* StrMid(char *dst, const char *src, int idx, int len);

这个函数接受四个参数:

  1. dst:目标字符串,函数将复制的子串存储在这里。
  2. src:源字符串,函数将从这里复制子串。
  3. idx:开始复制的位置。
  4. len:要复制的字符数。

现在,让我们逐步来看这个函数的实现。

首先,函数会检查参数是否合法。如果 idx 小于0,说明开始位置不正确,这时将目标串设为空串。

if (idx < 0) {dst[0] = '\0'; // 如果 idx 不正确,将目的串设为空串
}

然后,函数会计算源串的长度,并检查 idx 是否超过了源串的长度或者 len 是否不合法。如果是的话,同样将目标串设为空串。

else {int src_len = strlen(src);if (idx >= src_len || len <= 0) {dst[0] = '\0'; // 如果 idx 超出源串长度或 len 不正确,将目的串设为空串}

接下来,如果参数都合法,函数会修正 len 的值,确保不超出源串的长度。

else {if (len > src_len - idx) {len = src_len - idx;}

最后,函数使用 strncpy 函数从源串复制子串到目标串,并确保目标串以 null 结尾。

// 拷贝子串到目的串
strncpy(dst, src + idx, len);
dst[len] = '\0'; // 确保目的串以 null 结尾

最终,函数返回目标串的指针。

return dst;

这个函数的设计考虑了很多情况,确保了参数的合法性,并且在复制过程中进行了必要的修正。如果有任何问题,请随时提问。

在这里插入图片描述

http://www.lryc.cn/news/258397.html

相关文章:

  • 初识Dockerfile
  • Python入门第2篇(pip、字符串、方法、json、io操作)
  • IntelliJ IDEA 智能(AI)编码工具插件
  • Java编程中通用的正则表达式(二)
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • 接口测试-Jmeter使用
  • 十大排序(含java代码)
  • js基础:简介、变量与数据类型、流程循环控制语句、数组及其api
  • kubeadm搭建单master多node的k8s集群--小白文,图文教程
  • CSS层叠样式表一
  • 【等保】安徽省等保测评机构名单看这里!
  • 学习IO的第八天
  • 【clickhouse】ck远程访问另一个ck
  • Django的logging-日志模块的简单使用方法
  • ​argparse --- 命令行选项、参数和子命令解析器​
  • 洛谷 P8802 [蓝桥杯 2022 国 B] 出差
  • fastadmin配置教程
  • golang游戏服务器 - tgf系列课程01
  • react dom的diff理解及性能优化
  • 【acwing】92. 递归实现指数型枚举
  • 【面试】Java最新面试题资深开发-分布式系统中的CAP理论
  • Windows下使用CMD修改本地IP
  • 20231211-DISM++安装win10-22h2-oct
  • 前端知识笔记(五)———前端密钥怎么存储,才最安全?
  • 【智能家居】智能家居项目
  • 在AWS Lambda上部署标准FFmpeg工具——Docker方案
  • C#网络应用程序(Web页面浏览器、局域网聊天程序)
  • MacOS 14挂载NTFS 硬盘的最佳方式(免费)
  • SpringAOP专栏二《原理篇》
  • 冒泡排序(函数)