1.strcpy函数
char *strcpy(char *dest, const char *src)
引头文件<string.h>
功能:把 src 所指向的字符串复制到 dest
模拟实现:
#include<assert.h>
char* my_strcpy(char* dest, const char* ret)//strcpy函数的实现
{
assert(dest);
assert(ret);
char*cmp = dest;
while (*dest++=*ret++)
{
;
}
return cmp;
}
库中实现:
char * strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
}
2.strlen函数
size_t strlen(const char *str)
引头文件<string.h>
功能:计算字符串的长度,不包含'\0'
模拟实现:
int my_strlen(const char*str)//strlen函数的实现(计数)
{
int ret = 0;
while (*str)
{
str++;
ret++;
}
return ret;
}
int my_strlen(const char* str) //(递归)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);//不到'\0'就地址加一,数量加一
}
else
{
return 0;
}
}
void my_strlen(const char* str)//(指针相减)
{
const char* start = str; //起始位置的地址
const char* end = str;
while (*end != '\0')
{
end++;//得到最后一个元素的地址
}
return end - start;//两个指针相减得到中间元素个数以实现strlen函数
}
3.strcat函数
char *strcat(char *dest, const char *src)
功能:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
模拟实现:
char* my_strcat(char* dest, const char* src)//strcat函数的实现(追加函数)
{
char* tmp = dest;
while (*dest != '\0')//找到dest\0的前一个元素的地址
{
dest++;
}
while (*dest++ = *src++)//从\0开始将scr追加到dest后,scr自带'\0',
//所以可以将dest的'\0'用scr的首元素代换
{
;
}
return tmp;
}
库中实现:
char* strcat ( char * dst , const char * src )
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
//以上为长度不受限制的字符串函数
长度受限制的字符串函数:strncpy strncat strncmp 这些函数要一个形参n来限制长度(直到 n 字符长度为止)
4.strcmp函数
int strcmp(const char *str1, const char *str2)
功能:str1 所指向的字符串和 str2 所指向的字符串进行比较。
模拟实现:
int my_strcmp(char* str1, char* str2)//strcmp函数的实现
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1 - *str2);//大于返回正数,小于返回负数
}
/*如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/
库中实现:
int __cdecl strcmp (const char * src, const char * dst)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
5.strstr函数
char *strstr(const char *e1, const char *e2)
功能:在字符串 e1中查找第一次出现字符串 e2 的位置,不包含终止符 '\0'。(查找子串)
模拟实现:
char* my_strstr(const char* p1,const char* p2)
{
assert(p1);
assert(p2);
char* s1 = p1;
char* s2 = p2;
char* cur = p1;
if (*s2 == '\0')
return (char*)p1;
while (*cur)
{
s1 = cur;
s2 = p2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')//找到了
{
return cur;
}
cur++;
}
return NULL;//没找到
}
个人解读上述实现逻辑:
①为何要创建变量cur?找一个能存放p1找到的子串中首元素地址的临时变量,以便找到后能return回去
②为何要创建s1与s2?
创建s1的目的是有一个当cur指向子串首元素地址时,继续向后++查找是否相同,如果++后的元素不相同了,则s1可以在cur++后重置继续向下查找(可以理解为受cur操控的工具人);
创建s2的目的是解决如果直接使用p2进行++,则如果查找不全但又被++时,不好重置的问题,每次循环上来未查找完全时,就可以实现从头查找的目的
库中实现:
char * __cdecl strstr(const char *str1, const char *str2)
{
char *cp = (char *)str1;
char *s1, *s2;
if (!*str2)
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *)str2;
while (*s2 && !(*s1 - *s2))
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
字符分类函数
字符转换函数:大写转小写tolower() 小写转大写toupper()