文章目录
字符串的详解及其模拟实现
字符串函数的总体概括
求字符串长度
- strlen
长度不受限制的字符串函数
- strcpy
- strcat
- strcmp
长度受限制的字符串函数介绍
- strncpy
- strncat
- strncmp
字符串查找
- strstr
- strtok
错误信息报告
- strerror
字符操作
内存操作函数
- memcpy
- memmove
- memset
- memcmp
上面的函数,我会一一的讲解并且模拟实现
strlen
解析
size_t strlen ( const char * str );
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。(不然会出现随机值)
3.注意函数的返回值为size_t,是无符号的( 易错 )
例:
因为strlen的返回值是无符号整形,所以输出的结果是>
模拟实现
计数器法
int my_strlen(char* dest)
{
int c=0;
while(*dest)
{
dest++;
c++;
}
return c;
}
递归(当不能创造临时变量时的方法)
int my_strlen(char* dest)
{
if(*dest==’\0’)
return 0;
else
return 1+my_strlen(dest+1);
}
指针减指针
int my_strlen(char* dest)
{
char* start=dest;
while(*dest)
dest++;
return dest-start;
}
strcpy
解析
char* strcpy(char * destination, const char * source );
- 源字符串必须以 ‘\0’ 结束
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变(可以被改变)
模拟实现
strcat
解析
char * strcat ( char * destination, const char * source );
- 功能:追加字符串到目标字符串上
- 注意事项:源字符串必须以 ‘\0’ 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
模拟实现
char* my_strcat(char* dest,const char* src)
{
char* rem=dest;//保存起始地址
assert(dest&&src);//防止为空指针
while(*dest)//找到\0
dest++;
while(*dest++=*src++);//追加
return rem;//返回起始地址
}
strcmp
解析
int strcmp ( const char * str1, const char * str2 );
-
标准规定:
-
第一个字符串大于第二个字符串,则返回大于0的数字
-
第一个字符串等于第二个字符串,则返回0
-
第一个字符串小于第二个字符串,则返回小于0的数字
模拟实现
int my_strcmp(const char* str1,const char* str2)
{
assert(str1&&str2);
while(*str1==*str2)//先排除相同的
{
if(*str1=='\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;//比较并返回
}
strncpy
解析
char * strncpy ( char * destination, const char * source, size_t num );
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加’\0’,直到num个。
strncat
解析
char * strncat ( char * destination, const char * source, size_t num );
-
追加num个字符从源字符串到目标空间。
-
num超过source的长度时,只会追加source字符串到目标字符串中
strncmp
解析
int strncmp ( const char * str1, const char * str2, size_t num );
- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
strstr(字符串查找函数)
解析
char * strstr ( const char *str2, const char * str1);
- 从str1中找字符串str2,如果找到,返回str2在str1中所在地址,如果没找到,返回空指针。
模拟实现
char* mystrstr(const char* str1,const char* str2)
{
assert(str1,str2);
const char* a=const char* str1;//使用3个指针
const char* b=const char* str2;
const char* c=const char* str1;
if(*str2==' ')
return str1;
while(*a!='\0')
{
b=str2;
c=a;
while(*b&&*c&&*b==*c)
{
b++;
c++;
}
if(*b=='\0')
return a;
a++;
}
return NULL;
}