1.模拟实现strlen
//三种方法实现
#include <stdio.h>
#include <windows.h>
#include <assert.h>
//递归
int my_strlen1(const char *str)
{
assert(str);
if (*str == '\0')
{
return 0;
}
return 1 + my_strlen1(str + 1);
}
//非递归
int my_strlen2(const char *str)
{
assert(str);
int count = 0;
char *p = str;
while (*p)
{
if (*p == '\0')
{
return 0;
}
else
{
p++;
count++;
}
}
return count;
}
int my_strlen3(const char *str)
{
char *p = str;
while (*p != '\0')
{
p++;
}
return p - str; //指针-指针表示指针间跨越的个数
}
int main()
{
char str[] = "abcdef";
printf("len1 = %d\n", my_strlen1(str));
printf("len2 = %d\n", my_strlen2(str));
printf("len3 = %d\n", my_strlen3(str));
system("pause");
return 0;
}
结果如下:
2.模拟实现strcpy、strcat
#include <stdio.h>
#include <windows.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest)
{
dest++; //判断目标字符串是否到'\0'
}
while (*dest++ = *src++) //将源字符串拷贝给目标字符串
{
;
}
return ret;
}
char* my_strcpy(char* dest, const char* src)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = { 0 };
char *p = arr;
my_strcpy(p, "Hello");
printf("%s\n", p);
my_strcat(p, " world!");
printf("%s\n", p);
system("pause");
return 0;
}
结果如下:
3.模拟实现strcmp
#include <stdio.h>
#include <windows.h>
#include <assert.h>
int my_strcmp(const char *str1, const char *str2)
{
assert(str1);
assert(str2);
while (*str1 != '\0' && *str2 != '\0')
{
if (*str1 == *str2)
{
str1++, str2++;
}
else if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
if (*str1 != '\0') //如果str1长说明str1比str2大
{
return 1;
}
else if (*str2 != '\0') //如果str2长说明str2比str1大
{
return -1;
}
else
{
return 0;
}
}
int main()
{
char str1[] = "abcdeg";
char str2[] = "abcdef";
int ret = my_strcmp(str1, str2);
if (ret > 0)
{
printf("%s is greater than %s\n", str1, str2);
}
else if (ret == 0)
{
printf("%s is the same as %s\n", str1, str2);
}
else
{
printf("%s is less than %s\n", str1, str2);
}
system("pause");
return 0;
}
结果如下:
4.模拟实现strncpy、strncat
#include <stdio.h>
#include <windows.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,int num)
{
char *ret = dest;
assert(dest);
assert(src);
while (*dest)
{
dest++;
}
while (num && (*dest++ = *src++)) //拷贝num长的字符串到目标字符串中
{
num--;
}
*dest++ = '\0'; //将最后的'\0'拷入字符串中
return ret;
}
char* my_strncpy(char* dest, const char* src,int num)
{
char *ret = dest;
assert(dest);
assert(src);
while (num && (*dest++ = *src++)) //拷贝num长的字符串到目标字符串中
{
num--;
}
if (num > 0)
{
while (--num)
{
*dest++ = '\0'; //若num比源字符串长,那么多出的要拷贝字符用'\0'代替
}
}
return ret;
}
int main()
{
char arr[20] = { 0 };
char *p = arr;
my_strncpy(p, "Hellol",5);
printf("%s\n", p);
my_strncat(p, " world!!",7);
printf("%s\n", p);
system("pause");
return 0;
}
结果如下:
5.模拟实现strncmp
#include <stdio.h>
#include <windows.h>
#include <assert.h>
int my_srtncmp(const char *str1, const char *str2, size_t num)
{
assert(str1);
assert(str2);
while (num && (*str1 == *str2)) //比较str1和str2中前num个字符的大小
{
str1++;
str2++;
num--;
}
if (num > 0)
{
return *str1 - *str2; //将所有字符比较完后证明两字符串相等
}
else
{
return *(str1 - 1) - *(str2 - 1); //当遇到不相等时,指向的是不相等的字符
}
}
int main()
{
char str[][5] = { "rode", "ride", "root" };
int i = 0;
for (; i < 3; i++)
{
if (my_srtncmp(str[i], "rore", 2) == 0)
{
printf("result [%d] :%s\n", i, str[i]);
}
}
system("pause");
return 0;
}
结果如下:
6.模拟实现strchr(查找字符在字符串中第一次出现的位置)
#include <stdio.h>
#include <windows.h>
#include <assert.h>
char * my_strchr(const char * str, int ch)
{
assert(str);
while (*str && (*str != (char)ch)) //判断对应字符是否是所找字符
{
str++;
}
if (*str == (char)ch)
{
return (char *)str; //若找到了则返回它的地址
}
return NULL;
}
int main()
{
char str[] = "This is a sample string";
char *p = my_strchr(str, 's');
if (p != NULL)
{
printf("find the char at : %d\n", p - str + 1); //找到目标字符出现的位置
}
else
{
printf("could not find the char\n");
}
system("pause");
return 0;
}
结果如下:
7.模拟实现strstr(查找子串)
#include <stdio.h>
#include <windows.h>
#include <assert.h>
char *my_strstr(const char *dest, const char *src)
{
assert(dest);
assert(src);
char *start = (char *)dest;
char *substart = (char *)src;
char *ret = (char *)dest; //保存dest首地址
while (*ret)
{
start = ret;
while (*start && *substart && (*start == *substart))
{
start++;
substart++;
}
if (*substart == '\0')
{
return ret;
}
substart = (char *)src;
ret++; //得到原起始位置的下一个位置
}
return NULL;
}
int main()
{
char str[20] = "abcdefghijk";
char *p = str;
printf("%s\n",my_strstr(p, "defg"));
system("pause");
return 0;
}
结果如下: