【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);
这个函数接受四个参数:
dst
:目标字符串,函数将复制的子串存储在这里。src
:源字符串,函数将从这里复制子串。idx
:开始复制的位置。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;
这个函数的设计考虑了很多情况,确保了参数的合法性,并且在复制过程中进行了必要的修正。如果有任何问题,请随时提问。