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

简介: 【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;

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

目录
相关文章
|
6月前
|
Java
每日一题《剑指offer》字符串篇之替换空格
每日一题《剑指offer》字符串篇之替换空格
57 0
每日一题《剑指offer》字符串篇之替换空格
|
6月前
|
存储 C语言
【PTA刷题】请编写函数,求子串(详解+代码)
【PTA刷题】请编写函数,求子串(详解+代码)
120 0
|
6月前
面试题05-替换空格(LeeCode)
面试题05-替换空格(LeeCode)
33 0
|
算法
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
59 0
华为机试HJ12:字符串反转
华为机试HJ12:字符串反转
|
算法 索引
代码随想录算法训练营第八天 | 344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串
代码随想录算法训练营第八天 | 344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串
Leecode 5. 最长回文子串
Leecode 5. 最长回文子串
43 1
每日一题——反转字符串—II
每日一题——反转字符串—II