【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;

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

在这里插入图片描述

### PTA C++ Vector 模板使用方法 #### 定义与初始化Vector `vector` 是 STL 中的一种动态数组容器,允许在运行时调整大小。创建 `vector` 的方式有多种: ```cpp #include <iostream> #include <vector> using namespace std; int main() { // 创建一个空的 int 类型 vector vector<int> vec; // 初始化含有特定数量元素的 vector vector<int> vec_init(10, 0); // 含有十个整数,默认值为0 // 使用列表初始化器语法 vector<int> vec_list = {1, 2, 3}; } ``` #### 基本操作函数 对于 `vector` 的基本操作包括但不限于增加、访问以及删除元素。 - **添加元素** ```cpp vec.push_back(4); // 添加到末尾 // 插入指定位置之前的新元素 vec.insert(vec.begin(), 5); ``` - **访问元素** 可以直接通过下标索引来获取或修改向量中的元素[^1]。 ```cpp cout << "First element: " << vec[0]; cout << "\nLast element: " << vec.back(); ``` - **移除元素** 可以利用成员函数 `pop_back()` 来弹出最后一个元素;也可以用迭代器指向的位置作为参数调用 `erase()` 函数来删除单个元素或多组连续元素。 ```cpp if (!vec.empty()) { vec.pop_back(); // 移除最后一位 } auto it = find(vec.begin(), vec.end(), value_to_remove); if (it != vec.end()) { vec.erase(it); // 删除找到的第一个匹配项 } ``` #### 处理PTA目实例——寻找数字之王 针对给定范围内的自然数序列统计其中各个位上出现频率最高的数字称为“数字之王”。下面给出一段基于上述知识点解决该类问的具体实现方案[^2]: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; bool compare(const pair<int,int>& a,const pair<int,int>& b){ if(a.second==b.second)return a.first<b.first; return a.second>b.second; } void countMaxDigit(int start, int end) { vector<pair<int, int>> digitCount(10); for (int i = start; i <= end; ++i) { string numStr = to_string(i); for(char ch : numStr){ digitCount[ch-'0'].second++; } } sort(digitCount.begin(),digitCount.end(),compare); cout<<digitCount[0].second<<"\n"; bool isFirst=true; for(auto& p:digits){ if(p.second!=digits[0].second)break; if(!isFirst)cout<<" "; isFirst=false; cout<<p.first; } } ``` 此段程序实现了对一定区间内所有正整数各位数字频次的计算,并找出最高频次的一个或多个数字作为结果输出。注意这里为了处理可能存在的多位相同最大值情况特别设计了一个比较规则用于排序前后的筛选过程.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值