常见字符串函数的模拟实现
strlen
size_t strlen( const char *string );
- 和 sizeof 区别开来。sizeof是求字符串的大小,会将 '\0’也算进大小,strlen函数是求字符串的长度,长度不包含 ‘\0’
- 参数指向的字符串必须要以 ‘\0’ 结束
- 注意函数的返回值为size_t,是无符号整型
size_t my_strlen(const char *string)
{
assert(string); //检查合法性
char *str = (char*)string; //保护参数
size_t len = 0;
while (*str)
{
str++;
len++;
}
return len;
}
int main()
{
char *str = "abcdefghijklmnopqrstuvwxyz"; //26个英文字母噢兄弟们,不是24个哈哈哈,我是有证据的,看下面
int ret = my_strlen(str);
printf("str length = %d\n", ret);
return 0;
}
strcpy
char *strcpy( char *strDestination, const char *strSource );
- 返回值是目标空间的首地址
- 源字符串必须以‘\0’结尾,并且strcpy函数会将‘\0’一并复制到目标空间
- 目标空间必须是可变的
- 目标空间必须足够放下源字符串(注意包含‘\0’的长度)
char *my_strcpy(char *strDestination, const char *strSource)
{
assert(strDestination && strSource); //检查合法性
char *dest = (char*)strDestination; //保护参数
char *src = (char*)strSource;
while (*src) //相当于while(*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0'; //给目标空间结尾加字符串结束标志
return strDestination;
}
int main()
{
char str1[80];
char *str2 = "abcdefghijklmnopqrstuvwxyz";
my_strcpy(str1, str2);
printf("%s\n",str1);
return 0;
}
strcmp
int strcmp( const char *string1, const char *string2 );
- 第一个字符串**大于**第二个字符串,则返回大于0的数字
- 第一个字符串**等于**第二个字符串,则返回0
- 第一个字符串**小于**第二个字符串,则返回小于0的数字
int my_strcmp(const char *string1, const char *string2)
{
assert(string1 && string2); //检查合法性
char *str1 = (char*)string1; //保护参数
char *str2 = (char*)string2;
int size1 = strlen(str1); //判断长度
int size2 = strlen(str2);
if (size1 > size2)
return 1;
else if (size1 < size2)
return -1;
while (*str1) //经过前面的判断长度之后,能运行到这里肯定是两字符串长度相等的情况
{
int ret = 0;
ret = *str1 - *str2;
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
}
return 0;
}
int main()
{
char *str1 = "bbcd";
char *str2 = "abcd";
int ret = my_strcmp(str1, str2);
if (ret == 1)
printf("str1 > str2\n");
if (ret == 0)
printf("str1 = str2\n");
if (ret == -1)
printf("str1 < str2\n");
return 0;
}
strcat
char *strcat( char *strDestination, const char *strSource );
- 返回值是目标空间的首地址,所以进行参数保护是必要的
- 源字符串必须以‘\0’结尾,并且strcat函数会将‘\0’一并链接到目标空间的尾部
- 目标空间必须是可变的
- 目标空间必须足够放下源字符串(注意包含‘\0’的长度)
char *my_strcat(char *strDestination, const char *strSource)
{
assert(strDestination && strSource); //检查合法性
const char *src = (const char*)strSource; //保护参数
char *dest = (const char*)strDestination;
char *pdest = dest;
while (*pdest != '\0') // 找到目标空间的尾部,即目标空间'\0'的位置
{
pdest++;
}
while (*src != '\0') //在目标空间的'\0'位置链接
{
*pdest = *src;
src++;
pdest++;
}
*pdest = '\0'; //给目标空间结尾加字符串结束标志
return strDestination;
}
int main()
{
char str1[18] = { "abcdefghijk" };
char *str2 = "oooooo";
char *pdest = my_strcat(str1, str2);
printf("%s\n", pdest);
return 0;
}
Ohhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!他…他合体了