1.模拟实现strcpy
strcpy是字符串复制函数char* strcpy(char * destination, const char * source);
将source复制到destination中,会覆盖掉destination中的值,返回一个char* 类型。代码如下:
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* tmp = dest;
while (*dest++ = *src++)
{
;
}
return tmp;
}
int main()
{
char dest[100] = { 0 };
char src[] = "hello world";
my_strcpy(dest, src);
printf("%s\n", dest);
system("pause");
return 0;
}
模拟实现strcat
strcat字符串连接,产生的效果和strcpy类似,但不会覆盖。
char *strcat(char *strDestination, const char *strSource);
代码如下:
char* my_strcat(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char dest[100] = "hello";
char src[] = " world";
my_strcat(dest, src);
printf("%s\n", dest);
system("pause");
return 0;
}
3.模拟实现strcmp
int strcmp(const char *string1, const char *string2);
strcmp是字符串比较大小,比较的原理是比较对应的ASCII码值大小。如果str1和str2的第一个字符串比较出大小则返回值一个int值,如果没有比较出依次向后比较知道比较出结果。
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
代码如下:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
//当两个字符串其中有一个到\0时结束循环
while (*str1 != '\0' || *str2 != '\0')
{
//遍历字符串如果对应元素相等向后移动
if (*str1 == *str2)
{
str1++;
str2++;
}
//如果str1大于str2返回1
else if (*str1 > *str2)
{
return 1;
}
//如果str1<str2返回-1
else
{
return -1;
}
}
//如果有其中一个结束判断是哪一个结束
//str1先结束返回-1,str2先结束返回-2,同时结束返回0
if (*str1 == '\0' && *str2 == '\0')
{
return 0;
}
else if (*str1 == '\0' && *str2 != '\0')
{
return -1;
}
return 1;
}
int main()
{
char str1[] = "hello";
char str2[] = "world";
int ret = my_strcmp(str1, str2);
printf("%d\n", ret);
system("pause");
return 0;
}
4.模拟实现strstr
char *strstr( const char *string, const char *strcharset );
strstr是寻找字符串字串的位置,返回一个地。
代码如下:
char *my_strstr(const char *str, const char *set)
{
assert(str != NULL);
assert(set != NULL);
char* start = (char*)str;
char* sub = (char*)set;
char* cp = (char*)str;
//字符串没有结束就一直执行
while (*cp)
{
//将cp的位置赋给start
start = cp;
//从第一次出现相同字符开始遍历两个字符串,判断sub是否是start 中的字串
while (*start != '\0' && *sub != '\0' && *start == *sub)
{
start++;
sub++;
}
//如果是则返回cp
if (*sub == '\0')
{
return cp;
}
//如果不是则将sub调回原来的指向
sub = (char*)set;
//cp向后一位,继续下一次循环
cp++;
}
//遍历str还是没有找到则返回一个空指针
return NULL;
}
int main()
{
char str[] = "hello world";
char set[] = " wor";
my_strstr(str, set);
printf("%s\n", my_strstr(str, set));
system("pause");
return 0;
}
4.实现strchr
查找字符串中某字符第一次出现的位置,若没有出现返回null。类似于strstr。
char *strchr(const char *string, int c)
char *my_strchr(const char *str, int c)
{
assert(str != NULL);
while ((*str !='\0') && (((char)c) != *str))
{
str++;
}
if (*str != '\0')
{
return str;
}
else
{
return null;
}
}
int main()
{
char str[] = "hello world";
char c = 0;
char* ret = null;
printf("请输入要查找的字符:\n");
c = getchar();
ret = my_strchr(str, ((int)c));
if (ret == null)
{
printf("输入有误!\n");
}
else
{
printf("str: %p\n", str);
printf("c: %p\n", ret);
printf("%s\n", ret);
}
system("pause");
return 0;
}