【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;
這個函數的設計考慮了很多情況,確保了參數的合法性,并且在復制過程中進行了必要的修正。如果有任何問題,請隨時提問。