模拟实现几个str库函数的功能:
首先,应用的头文件如下:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
主函数如下,为了观察结果更加清晰,我在代码里顺便分了一下显示区域,并且每个模拟实现的函数都与其对应的库函数结果进行了对比:
int main()
{
char str1[] = { "abcdef" };
char str2[30] = { "0" };
char str3[30] = { "123456" };
printf("str1=%s\nstr2=%s\nstr3=%s\n",str1,str2,str3);
printf("************************************************\n");
//My_strlen(str1);
printf("My_strlen:\nMy_strlen1(str1):len(str)=%d\n", My_strlen1(str1));
printf("My_strlen2(str1):len(str)=%d\n", My_strlen2(str1));
printf("My_strlen3(str1):len(str)=%d\n", My_strlen3(str1));
printf("strlen(str1):len(str)=%d\n", strlen(str1));
printf("************************************************\n");
//My_strcpy(str2, str1);
printf("My_strcpy:\nMy_strcpy(str2,str1):str2=%s\n", My_strcpy(str2, str1));
printf("strcpy(str2,str1):str2=%s\n", strcpy(str2, str1));
printf("************************************************\n");
//My_strcat(str3, str1);
printf("My_strcat:\nMy_strcat(str3,str1):str3=%s\n", My_strcat(str3, str1));
printf("strcat(str3,str1):str3=%s ", strcat(str3, str1));
printf("(在My_strcat的结果的基础上再进行一次strcat!)\n");
printf("************************************************\n");
//My_strstr(str1,"bcd");
printf("My_strstr:\nMy_strstr(str1,'bcd'):%s\n", My_strstr(str1, "bcd"));
printf("strstr(str1,'bcd'):%s\n", strstr(str1, "bcd"));
printf("************************************************\n");
//My_strchr(str1,'d');
printf("My_strchr:\nMy_strchr(str1, 'd'):%s\n", My_strchr(str1, 'd'));
printf("My_strchr(str1, 'd'):%s\n", My_strchr(str1, 'h'));
printf("strchr(str1, 'h'):%s\n", strchr(str1, 'd'));
printf("strchr(str1, 'h'):%s\n", strchr(str1, 'h'));
printf("************************************************\n");
//My_strcmp(str1,str3);
printf("My_strcmp:\nMy_strcmp(str1,str3):%d\n", My_strcmp(str3, str1));
printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str3));
printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str2));
//str2已被修改,此时str2=str1
printf("strcmp(str1,str3):%d\n", strcmp(str3, str1));
printf("strcmp(str1,str3):%d\n", strcmp(str1, str3));
printf("strcmp(str1,str3):%d\n", strcmp(str1, str2)); //str2已被修改,此时str2=str1
printf("************************************************\n");
system("pause");
return 0;
}
各部位代码:
1·strlen(求字符串长度,这里用了三种不同的方法):
int My_strlen1(char *str) //方法1:计数器求strlen
{
assert(str);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int My_strlen2(char *str) //方法2:递归方法求strlen
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + My_strlen2(str+1);
}
int My_strlen3(char *str) //方法3:尾指针-头指针方法求strlen
{
assert(str);
char *p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
2·strcpy(字符串拷贝):
char *My_strcpy(char *dst, const char *src)
{
assert(dst);
assert(src);
char *ret = dst;
/*while (*dst=*src)
{
dst++;
src++;
}*/
while (*dst++ = *src++)
{
;
}
//稍作改进
return ret;
}
3·strcat(字符串追加):
char *My_strcat(char *dst, const char *src)
{
assert(dst);
assert(src);
char *ret = dst;
while (*dst)
{
dst++;
}
while (*src)
{
*dst =*src;
src++;
dst++;
}
return ret;
}
4·strstr(子字符串查找):
char *My_strstr(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
char *p_str1 = (char *)str1;
char *p_str2 = (char *)str2;
char *pc_str1=NULL;
if (*str2=='\0')
{
return NULL;
}
while (*p_str1)
{
pc_str1 = p_str1;
p_str2 = (char *)str2;
while ((*pc_str1 == *p_str2)&&(*p_str2)&&(*pc_str1))
{
pc_str1++;
p_str2++;
}
if (*p_str2 == '\0')
{
return p_str1;
}
p_str1++;
}
return NULL;
}
5·strchr(字符查找):
char *My_strchr(char *str, int p) //字符可转为ASCLL值,故参数2可为int类型
{
assert(str);
assert(p);
char *ret = str;
while (*str)
{
if (*str == p)
return str;
else
str++;
}
return NULL;
}
6.strcmp(字符串比较):
int My_strcmp(const char *str1, const char* str2)
//若参数1>参数2,返回1;若参数1<参数2返回-1;若相等,返回0
{
assert(str1);
assert(str2);
while (*str1)
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
break;
}
if ( (*(unsigned char *)str1 - *(unsigned char *)str2) > 0)
return 1;
else if ((*(unsigned char *)str1 - *(unsigned char *)str2) < 0)
return -1;
return 0;
}
显示结果如下:
经过验证,功能与库函数功能基本一致。