strlen
strcpy
strcmp
strcat
strstr
memcpy
memmove
三种方式实现strlen
函数使用方法
char* str = "I am the best!";
printf("%d\n", strlen(str));
模拟实现
①指针-指针
#pragma warning (disable:4996)
#include<stdio.h>
int MyStrlen(char* p)
{
char* s = p;
while (*s != '\0')
{
s++;
}
return s-p;
}
int main()
{
char* a = "Lilan is my girl!";
printf("%d\n", MyStrlen(a));
return 0;
}
②递归
#include<stdio.h>
int MyStrlen(char* str)
{
if (*str == '\0')
return 0;
return 1 + MyStrlen(str + 1);
}
int main()
{
char* str1 = "lilan is cute!";
printf("%d\n", MyStrlen(str1));
return 0;
}
③计数器
#include<stdio.h>
int MyStrlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char *str = "Lilan is cute!";
printf("%d\n", MyStrlen(str));
return 0;
}
strcpy
函数使用方法
char *strcpy( char *dest, const char *src );
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void MyStrcpy(char *str1, char *str2)
{
for (int i = 0;; i++)
{
*(str2 + i) = *(str1 + i);
if (*(str1+i) == '\0')
break;
}
}
int main()
{
char str1[999];
char str2[999];
scanf("%s", str1);
MyStrcpy(str1,str2);
printf("复制后str2的内容为:%s\n", str2);
return 0;
}
strcmp
函数使用方法
int strcmp( const char *string1, const char *string2 );
//返回值为int类型
//< 0 string1 smaller than string2
//= 0 string1 等于 string2
//> 0 string1 bigger than string2
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<assert.h>
int MyStrcmp(char *str1, char *str2)
{
assert(str1&&str2);
if (str1 == NULL)
return -1;
if (str2 == NULL)
return 1;
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
{
return -1;
}
}
int main()
{
char* str1 = "azcd";
char* str2 = "afcd";
printf("%d\n", MyStrcmp(str1, str2));
return 0;
}
strcat(字符串拼接)
函数使用方法
char *strcat( char *dest, const char *src );
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrcat(char *dest,char *src)
{
char *p = dest;
while (*dest != '\0')
{
dest++;
}
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return p;
}
int main()
{
//注意这里不能是指针,字符串放在只读区,不能修改
//数组形式是对内存的一份拷贝
char dest[20] = "bit";
char *src = "hello";
MyStrcat(dest, src);
printf("%s\n", dest);
return 0;
}
strtok(字符串分隔函数)
函数使用方法
char *strtok( char *str, const char *strDelimit );
//str目标字符串
//strDelimit 一个或多个分隔符
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "2000.08.01/lkl";
char* p = strtok(str, "./");
while (p != NULL)
{
printf("%s\n", p);
p = strtok(NULL, "./");
}
return 0;
}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLwcDN0QDOwgTM1ITMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
strstr(在主串中寻找子串)
函数使用方法
char *strstr( const char *string1, const char *string2 );
//在string1中寻找string2;
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrstr(char* str1, char* str2)
{
char* start = str1;
while (*start != '\0')
{
char* s1 = start;//每次都从start开始
char* s2 = str2; //每次从头开始
while (s1 && s2 && *s1 == *s2)
//主串子串相同,就往后加,但不能是\0
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return start;
}
start++;//不一样之后主串往后加一
}
return NULL;
}
int main()
{
char *str1 = "likunlong";
char* str2 = "kun";
printf("%s\n", MyStrstr(str1, str2));
return 0;
}
memcpy(内存拷贝函数)
函数使用方法
void *memcpy( void *dest, const void *src, int count );
//count为所拷贝字节数
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<memory.h>
void* MyMemcpy(void* dest, void* src, int count)
{
void* ret = dest;
while (count != 0)
{
*(char*)dest = *(char*)src;
((char*)dest)++;//++优先级高,给前面带括号
((char*)src)++;
count--;
}
return ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
//MyMemcpy(arr, arr + 2, 16);
MyMemcpy(arr+2,arr,16);
int i = 0;
for (; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memmove
函数使用方法
void *memmove( void *dest, const void *src, int count );
//count为所移动字节数
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void* MyMemmove(void* dest, void* src, int count)
{
void* ret = dest;
if (src > dest)
{
while (count != 0)
{
*(char*)dest = *(char*)src;
((char*)dest)++;//++优先级高,给前面带括号
((char*)src)++;
count--;
}
}
//src<dest的情况,发生内存重叠,从后往前拷贝
else
{
count--;//15次
while (count >= 0)
{
*((char*)dest + count) = *((char*)src + count);
count--;
}
}
return ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
MyMemmove(arr + 2, arr, 16);
int i = 0;
for (; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}