字串A中出現B時就用C來代替
阿新 • • 發佈:2019-01-05
這個問題的重點是不使用STL
C語言的動態分配記憶體:
- malloc(分配的位元組大小)
- free()
cstring庫中的函式:
- strlen()
- strncmp()
- strncat()
- strncpy()
該演算法使用的格外空間大小
思路:
- 找出A中所有B的開始位置,儲存在陣列arr_B_in_A中,arr_B_in_A的大小為B可能出現的最大次數。
- 使用strncat拼接p_A和p_C
#include <cstring>
#include <iostream>
char* string_replace(char* p_A, char* p_B, char* p_C) {
int n_A = strlen(p_A), n_B = strlen(p_B), n_C = strlen(p_C);
if (n_A < n_B)
return p_A;
int* arr_B_in_A = (int*)malloc(n_A / n_B * sizeof(int));
int pos_end = 0;
for (int i = 0; i != n_A - n_B + 1; i++) {
if (strncmp(p_A + i, p_B, n_B) == 0) {
arr_B_in_A[pos_end++] = i;
i += n_B - 1;
}
}
if (pos_end == 0) {
free(arr_B_in_A);
return p_A;
}
char* res = (char*)malloc(n_A + pos_end * (n_C - n_B));
for (int i = 0; i != pos_end; i++) {
if (i == 0)
strncat(res, p_A, arr_B_in_A[i]);
else
strncat(res, p_A + arr_B_in_A[i-1] + n_B,
arr_B_in_A[i] - arr_B_in_A[i-1] - n_B);
strncat(res, p_C, n_C);
}
strncat(res, p_A + arr_B_in_A[pos_end-1] + n_B, n_A);
free(arr_B_in_A);
return res;
}
int main() {
char a[] = "oui am your dad areou ouou", b[] = "ou", c[] = "a";
std::cout << "origin : " << a << std::endl;
std::cout << "final : " << get_new_str(a, b, c) << std::endl;
}