1、模拟实现strcmp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int Strcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
int i = 0;
for (; str1[i] != '\0'&&str2 != '\0'; ++i) {
if (str1[i] < str2[i]) {
return -1;
} else if (str1[i] > str2[i]) {
return 1;
} else {
}
}
if (str1[i] < str2[i]) {
return -1;
} else if (str1[i] < str2[i]) {
return 1;
} else {
return 0;
}
}
int main() {
char arr[1024] = "abcde";
char brr[1024] = "abc";
int ret = Strcmp(arr, brr);
if (ret == 0) {
printf("arr == brr\n");
} else if (ret < 0) {
printf("arr<brr\n");
} else {
printf("arr>brr\n");
}
system("pause");
return 0;
}
2、模拟实现strcpy
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strcpy(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
for (int i = 0; dest[i] != '\0'; ++i) {
dest[i] = src[i];
}
return dest;
}
int main() {
char arr[1024] = "abcde";
char brr[1024] = "drf";
printf("%s\n",Strcpy(arr, brr));
system("pause");
return 0;
}
3、模拟实现strcat
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strcat(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
int i = 0;
for (; dest[i] != '\0'; ++i);
for (int j = 0; src[j] != '\0'; ++j, ++i) {
dest[i] = src[j];
}
dest[i] = '\0';
return dest;
}
int main() {
char arr[1024] = "abcde";
char brr[1024] = "drf";
printf("%s\n", Strcat(arr, brr));
system("pause");
return 0;
}
4、模拟实现strstr
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strstr(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
if (*str2 == '\0') {
return NULL;
}
char* black_ptr = str1;//黑指针功能是记录从哪个位置找字符串子串
while (*black_ptr != '\0') {
//红指针帮我们完成具体的子串比较
char* red_ptr = black_ptr;
char* sub_ptr = str2;
while (*red_ptr != '\0'&&*sub_ptr != '\0'&&*red_ptr == *sub_ptr) {
++*sub_ptr;
++*red_ptr;
}
if (*sub_ptr == '\0') {
return black_ptr;
}
++black_ptr;
}
return NULL;
}
int main() {
char arr[1024] = "abce";
char brr[1024] = "bcd";
char* ret = Strstr(arr, brr);
printf("%p\n", arr);
printf("%p\n", *ret);
system("pause");
return 0;
}
5、模拟实现strchr
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
const char* Strchr(const char* str, int character) {
assert(str != NULL);
while (*str != '\0') {
if (*str == character) {
return str;
}
++str;
}
if (*str == '\0') {
return NULL;
}
}
int main() {
char arr[1024] = "abcde";
char input = 'g';
printf("%p\n", arr);
printf("%p\n", Strchr(arr, input));
system("pause");
return 0;
}
6、模拟实现memcpy
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
const void* Memcpy(void* dest, const void* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
const char* psrc = (const char*)src;
char* pdest = (char*)dest;
for (size_t i = 0; i < num; ++i) {
pdest[i] = psrc[i];
}
return dest;
}
int main() {
char arr[1024] = "abcde";
char brr[1024] = "def";
printf("%s\n", Memcpy(arr, brr, sizeof(brr)));
system("pause");
return 0;
}
7、模拟实现memmove
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *Memmove(void *dest, const void *src, size_t num) {
/*因为char类型为1字节,所以将数据转化为char*进行操作。并不是因为操作的对象是字符串*/
assert(dest);
assert(src);
char* pdest = (char *)dest;
const char* psrc = (const char *)src;
if (pdest <= psrc && pdest >= psrc + num) {
//正常情况下从前向后拷贝
while(n--){
*(pdest++) = *(psrc++);
}
else {
//当出现内存覆盖时从后向前拷贝
while (num--) {
*(pdest + num) = *(psrc + num);
}
}
return dest;
}
int main() {
char arr[1024] = "abcde";
printf("%s\n", Memmove(arr + 1, arr, sizeof(arr[0]) * 5));
system("pause");
return 0;
}