目录
strlen函数(求字符串长度)
计数器方法
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
递归方法
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
assert(str);
if (*str)
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
指针-指针方法
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
assert(str);
char* tmp = str;
while (*++tmp)
{
;
}
return tmp - str;
}
注:两个指针相减得到的是两指针中间元素的个数。
strcpy函数(字符串拷贝)
#include <stdio.h>
#include <assert.h>
//strcpy函数返回的是目标空间的起始地址
//strcpy函数的返回类型的设置是为了实现链式访问
char* my_strcpy(char* dest, const char* str)
{
assert(dest && str);
char* ret = dest;
//记录起始地址
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello world";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
strcat函数(字符串追加)
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* str)
{
assert(dest && str);
char* ret = dest;//记录起始地址
//找目标字符串中的'\0'
while (*dest)
{
dest++;
}
//拷贝
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
strcmp函数(字符串比较)
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* dest, const char* str)
{
assert(dest && str);
while (*dest == *str)
{
if (*dest == '\0')
{
return 0;//相等
}
dest++;
str++;
}
//不相等
return *dest - *str;
}
int main()
{
char arr1[] = "abcde";
char arr2[] = "qhavs";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf(">\n");
}
else if (ret == 0)
{
printf("=\n");
}
else
{
printf("<\n");
}
return 0;
}
strstr函数(找长串中子串首次出现的位置)
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* dest, const char* str)
{
assert(dest && str);
const char* s1 = dest;
const char* s2 = str;
const char* cur = dest;
while (*cur)
{
s1 = cur;
s2 = str;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abheabcdg";
char arr2[] = "bcd";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
strncpy函数(拷贝n个字符)
#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* dest, const char* str, int ret)
{
assert(dest && str);
char* tmp = dest;
int i = 0;
for (i = 0; i < ret; i++)
{
*dest++ = *str++;
}
return tmp;
}
int main()
{
char arr1[10] = "helloxxxx";
char arr2[7] = "world";
printf("%s\n", my_strncpy(arr1, arr2, 5));
return 0;
}
strncat函数(追加n个字符)
#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* str, int n)
{
assert(dest && str);
char* ret = dest;//记录起始地址
//找目标字符串中的'\0'
while (*dest)
{
dest++;
}
//拷贝
int i = 0;
for (i = 0; i < n; i++)
{
*dest++ = *str++;
}
//字符串追加最后要多加一个'\0'
*dest = '\0';
return ret;
}
int main()
{
char arr1[20] = "hello\0xxxxxxxx";
char arr2[7] = "world";
printf("%s\n", my_strncat(arr1, arr2, 5));
return 0;
}