目录
一.字符串函数
1.strlen
①.函数功能
用于计算字符串长度。-------以'\0'为结束标志。
参数:字符串
返回类型 size_t (无符号形)
②.实例
③. 函数模拟
size_t my_strlen(char* arr)
{
int len = 0;
char* p = arr;
while (*p!='\0')
{
len++;
p++;
}
return len;
}
2. strcpy
①.函数功能
用于字符串拷贝。
参数:字符串和字符串
返回类型:char*
注意事项:
1.把字符串2拷贝到字符串1,会覆盖字符串1。
2.字符串1的空间必须足够大,能存放拷贝过来的字符串。
3.字符串内的空间必须可变,不能是常量字符串。
eg:
char*p="abcdefg"char arr[]="ooxx";
p指向的空间不可变。
②.实例
③.函数模拟
char* my_strcpy(char* arr, const char* arr2)
{
while (*arr2 != '\0')
{
*arr = *arr2;
arr++;
arr2++;
}
return arr;
}
3.strcat
①.函数功能
用于字符串连接。
参数:字符串和字符串
返回类型:char*
字符串1的空间必须足够大,能存放连接过来的字符串。
字符串1内的空间必须可变,不能是常量字符串。
②.实例
③.函数模拟
char* my_strcat(char* arr, const char* arr2)
{
char* p = arr;
while (*arr != '\0')
{
arr++;
}
while (*arr2 != '\0')
{
*arr = *arr2;
arr2++;
arr++;
}
return p;
}
4.strcmp
①.函数功能
用于字符串比较大小
参数:两个字符串
返回类型:int(字符串A>字符串B,返回1,反之返回-1,相等返回0)
②.实例
③.函数模拟
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 != '\0' && (*str2 != '\0'))
{
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
else
{
str1++;
str2++;
}
}
return 0;
}
5.strncpy
①.函数功能
用于拷贝n个字符从源字符串到目标空间。
参数:目标空间和源字符串,一个size_t类型指定字符数
返回类型:char*
目标空间得足够大 以备存放拷贝到的字符串
②.实例
③.函数模拟
char* my_strncpy(char* str1, const char* str2, size_t sz)
{
while (sz--)
{
*str1 = *str2;
str1++;
str2++;
}
return str1;
}
6.strncat
①.函数功能
用于连接n个字符从源字符串到目标空间。
参数:目标空间,源字符串,一个size_t类型指定字符数
返回类型:char*
目标空间得足够大 以备存放连接到的字符串
②.实例
③.函数模拟
char* my_strncat(char* str1,const char* str2,size_t sz)
{
char* start = str1;
while (*str1 != '\0')
{
str1++;
}
while (sz--)
{
*str1 = *str2;
str1++;
str2++;
}
return start;
}
7.strncmp
①.函数功能
用于比较到出现另个字符不一样或者一个字符串结束或者 num个字符全部比较完。参数:源字符串,目标空间,一个size_t类型指定字符数返回类型:int型 -- str1>str2 返回 1-- str1<str2 返回 -1-- str1=str2 返回 0
②.实例
③.函数模拟
int my_strncmp(const char* str1, const char* str2, size_t sz)
{
while (*str1 != '\0' && (*str2 != '\0') && sz--)
{
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
else
{
str1++;
str2++;
}
}
return 0;
}
8.strstr
①.函数功能
用于判断子串。
参数:一个母串,一个字符串。
返回类型:char* (返回子串在母串的起始地址)
②.实例
③.函数模拟
char* my_strstr(const char* str1,const char* str2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cur = str1;
while (*cur != '\0')
{
s1 = cur; //没找到复位
s2 = str2; //没找到复位
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) //相等且不为空
{
s1++;
s2++;
}
if (*s2 == '\0') //找到了
{
return cur;
}
cur++; //没找到且不相等,就往后走
}
return NULL; //没找到
}
9.strerror
①.函数功能
用于返回错误码,所对应的错误信息。
参数:int类型的错误码
返回类型:char* ----错误信息
需包含头文件#include<errno.h>
②.实例
二.内存函数
1.memcpy
①.函数功能
用于从source的位置开始向后复制num个字节的数据到destination的内存位置。
参数:目标空间,源空间,几个字节
返回类型:void* (数据决定返回类型)
②.实例
③.函数模拟
void* my_memcpy(void* arr, const void* brr, int sz)
{
void* ret = arr;
while (sz--)
{
(*(char*)arr) = (*(char*)brr);
arr = (char*)arr + 1; //void*类型无法运算
brr = (char*)brr + 1;
}
return ret;
}
2.memmove
①.函数功能
用于从source的位置开始向后复制num个字节的数据到destination的内存位置。
参数:目标空间,源空间,几个字节
返回类型:void*(按数据决定)
②.实例
③.函数模拟
void* my_memmove(void* arr, const void* brr, size_t num)
{
void* ret = arr;
if (arr < brr)
{
//前-->后
while (num--)
{
*(char*)arr = *(char*)brr;
arr = (char*)arr + 1;
brr = (char*)brr + 1;
}
}
else
{
//后->前
while (num--)
{
*((char*)arr + num) = *((char*)brr + num);
}
}
return ret;
}
④.memove与memcpy的区别
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。