字符串函数的模拟实现
Ciallo~ (∠・ω< )⌒★
1. strlen
函数原型:
size_t strlen ( const char * str );
功能:
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )。
模拟实现:
//模拟实现strlen
size_t my_strlen(const char* str) //注意返回值类型是size_t,是无符号的
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
2. strcpy
函数原型:
char* strcpy(char * destination, const char * source );
注意:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
模拟实现:
模拟实现strcpy
char* my_strcpy(char* des, char* str)
{
char* ret = des;
while (*des++ = *str++) //先解引用赋值,再加一
{
;
}
return ret;
}
// 在C和C++中,赋值语句的返回值是赋值操作的结果,即被赋予的值。
// 这意味着,当你执行一个赋值操作时,该操作将返回被赋的值,而不是一个表示成功或错误的状态码。
3. strcat
函数原型:
char* my_strcat(char *dest, const char*src)
注意:
源字符串必须以 '\0' 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
模拟实现:
char* my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest) //先找到\0的位置
{
dest++;
}
while((*dest++ = *src++)) //追加
{
;
}
return ret;
}
4. strcmp
模拟实现:
int my_strcmp (const char * str1, const char * str2)
{
int ret = 0 ;
assert(str1 && str2);
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
5. strncpy
函数原型:
char * strncpy ( char * destination, const char * source, size_t num );
注意:
拷贝num个字符从源字符串到目标空间。
如果源字符串的⻓度⼩于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
模拟实现:
char* my_strncpy(char* des, const char* str, size_t num)
{
char* ret = des;
while (num && (*des++ = *str++))
{
num--;
}
if (num) // 如果num比str长的话,缺几个就补几个\0
{
while (num--)
{
*des++ = '\0';
}
}
return ret;
}
6. strncat
函数原型:
char * strncat ( char * destination, const char * source, size_t num );
注意:
该函数时将 source 指向字符串的前 num 个字符追加到 destination 指向的字符串末尾,再追加⼀个 \0 字符。
如果 source 指向的字符串的长度小于 num 的时候,只会将字符串中到 \0 的内容追加到 destination 指向的字符串末尾。
模拟实现:
char* my_strncat(char* des, const char* src, size_t num)
{
char* cur = des;
while (*cur != '\0')
{
cur++;
}
while (num && (*cur++ = *src++))
{
num--;
}
*cur = '\0';
return des;
}
7. strncmp
函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );
模拟实现:
//模拟实现strncmp
int my_strncmp(char* str1, char* str2, size_t num)
{
while (num--)
{
if (*str1 == *str2)
{
if (*str1 == '\0')
{
break;
}
else
{
str1++;
str2++;
}
}
else
return (*str1 - *str2);
}
return 0;
}
8. strstr
函数原型:
char * strstr ( const char * str1, const char * str2);
功能:
查找 str2 是否在 str1 中出现,若是,则返回起始元素地址。否,则返回空指针。
模拟实现:
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* cur = str1;
const char* s1 = NULL;
const char* s2 = NULL;
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
五颜六色的生活,不能乱七八糟的过。
友友们,你们很棒了,加油!