strlen,strstr,strcmp,strcat,strcpy是对于字符串处理的几个简单的库函数,在这片博客中我用my_strlen,my_strstr,my_strcmp,my_strcat,my_strcpy这几个函数来模拟实现一下这几个库函数。
1.strlen():所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
方式一:计数器
int my_strlen(char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
*str++;
}
return count;
}
方式二:递归实现
int my_strlen(const char* str)
{
assert(str);
if (*str == "\0")
{
return 0;
}
else
{
return 1 + my_strlen(++str);
}
}
2.strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
char* my_strstr(const char* str, const char* substr)
{
assert(str != NULL);
assert(substr != NULL);
if (*substr == '\0') //如果子串为空直接返回源字符串
{
return str;
}
while (*str)
{
const char*s1 = str;
const char*s2 = substr;
while (*s1 && *s2 && *s1 == *s2) // *s1和*s2不为'\0'
{
s1++;
s2++;
}
if (*s2 == '\0') //只有当*s2 == '\0'时说明子串内已经找完了结束
{
return str; //返回str因为str记录了初始的位置 只有s1和s2在++
}
str++;
}
return NULL;
}
3.strcmp:
比较两个字符串
设这两个字符串为str1,str2,
若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
strcmp的实现原理就是将字符串的每个字符进行对比,直到两个字符串都遇到“\0”,否则返回str1-str2;
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char* str1 = "abcef";
char* str2 = "asssssf";
int ret = my_strcmp(str1, str2);
if (ret > 0)
{
printf("str1>str2");
}
else if (ret == 0)
{
printf("str1=str2");
}
else
{
printf("str1<str2");
}
system("pause");
return 0;
}
4.my_strcat:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
要注意的是我们在进行strcat操作时,必须确保目标字符串足够长。
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest)
{
*dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char str1[100] = "hello ";
char* str2 = "world";
char* ret = my_strcat(str1, str2);
printf("%s\n", ret);
system("pause");
return 0;
}
5.strcpy:把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* result = dest;
while (*dest++ = *src++)
{
;
}
return result;
}
int main()
{
char str1[100];
char* str2 = "hello world";
char* ret = my_strcpy(str1, str2);
printf("%s\n", ret);
system("pause");
return 0;
}