在学习C语言的时候,离不开字符函数和内存函数的使用,只要理解了函数的功能,那这些函数使用都挺简单。但是将来作为码农的我们,必须理解这些函数是怎么实现的。
下面是字符函数和内存函数合集。
一、字符函数
1、strcat
#include<assert.h>
#include <stdio.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src); // 断言 dest和src都不为空
char* ret = dest;
while (*dest) // dest到最后一个字节
dest++;
while (*dest++ = *src++) // 追加src到dest
;
return ret;
}
int main()
{
char arr1[20] = "abcd";
my_strcat(arr1, "efg");
printf("%s", arr1);
}
2、strcmp
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2); // 断言 s1和s2都不为空
while (*s1 == *s2) // 当前s1和s2的值相同
{
if (*s1 == '\0') // s1或s2这个时候是最后一个字节 说明两个字符相等
return 0;
s1++;
s2++;
}
return *s1 - *s2; // 如果不相等返回相应数值
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
int ret = my_strcmp(arr1, arr2);
if (ret < 0)
printf("<\n");
else if (ret > 0)
printf(">\n");
else
printf("=\n");
}
3、strcpy
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
char* ret = dest;
assert(dest && src); // 断言 dest和src不为空
while ((*dest++ = *src++) != '\0') // 将src一次赋给dest
;
return ret;
}
int main()
{
char arr1[20] = "abcde";
char arr2[] = "dfdssd";
my_strcpy(arr1, arr2);
printf("%s", arr1);
}
4、strlen
#include<stdio.h>
#include<assert.h>
int my_strlen(char* s1)
{
assert(s1); // 断言 s1不为空
char* p = s1;
while (*s1 != '\0') // s1循环到最后一个字节
s1++;
return s1 - p; // 返回字节差值
}
int main()
{
char arr1[] = "abcdef";
printf("%d", my_strlen(arr1));
}
5、strstr
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2); // 断言 str1和str2不为空
char* s1;
char* s2;
char* cp = str1; // cp指向str1中与str2首字符相匹配的字符
if (*str2 == '\0') // str2为空串
return str1;
while (*cp)
{
// s1和s2用来匹配两字符串相同字符
s1 = cp;
s2 = str2;
// 匹配相同字符
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0') // s2结束
return cp;
cp++; // 如果当前不匹配cp加一
}
return NULL; // cp指向str1末尾时,说明没有与str2匹配项
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bc";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("找不到!\n");
else
printf("%s\n", ret);
}
二、内存函数
1、memcpy
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
void* ret = dest;
assert(dest && src);
while (count--) // 字节数
{
*(char*)dest = *(char*)src; //单字节赋值
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr1, arr2, 4*sizeof(arr1[0]));
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", arr1[i]);
return 0;
}
2、memmove
当dest的内存比src小时,我们想要把src开始的值赋给dest,如果从后向前执行,06 00 00 00会覆盖
04 00 00 00,05 00 00 00覆盖03 00 00 00,这时的03 00 00 00 04 00 00 00这段内存已经变为
04 00 00 00 05 00 00 00结果如下图
当dest的内存比src大时,我们想要把src开始的值赋给dest,如果从前向后执行,01 00 00 00会覆盖03 00 00 00,02 00 00 00覆盖04 00 00 00,这时的03 00 00 00 04 00 00 00这段内存已经变为01 00 00 00 02 00 00 00结果如下图
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
void* ret = dest;
assert(dest && src);
if (dest < src) // 当src指向的内存值大于dest指向的内存值 采用从前向后赋值
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else // 除上面情况 采用从后向前赋值
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 4 * sizeof(arr[0]));
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", arr[i]);
return 0;
}