目录
一、strcmp函数
1.strcmp函数声明
int strncmp(const char* str1, const char* str2, size_t n);
2.strcmp函数头文件
# include<stdio.h>
3.strcmp函数使用例
函数使用解释:把str1所指向的字符串和str2所指向的字符串进行比较,相等时返回0,是str1大于或者小于str2时返回值不为0
#include<stdio.h>
#include<string.h>
int main()
{
char a[20] = "zhangsan";
char b[20] = "zhangmou";
int ret = strcmp(a, b);
if (ret < 0)
printf("<\n");
else if (ret == 0)
printf("==\n");
else
printf(">\n");
}
4.my_strcmp模拟strcmp函数实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)//相等就向后跳一位
{
if (*str1 == '\0')//防止到\0时还没有结束
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char a[20] = "zhangsan";
char b[20] = "zhangmou";
int ret = strcmp(a, b);
if (ret < 0)
printf("<\n");
else if (ret == 0)
printf("==\n");
else
printf(">\n");
}
my_strcmp模拟实现strcmp函数,实现时是字节对等,相等则跳过,不相等了则跳出,判断两者的大小,一般情况我都用于等于零的情况。
二、strstr函数
1.strstr函数声明
char* strstr(const char* str1, const char* str2);
2.strstr函数头文件
#include<string.h>
3.strstr函数使用例
函数使用解释:函数用于判断字符串str2是否是str1的子串 ,则该函数返回str2在str1中首次出现的地址,如果不存在子串返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "123456";
char b[] = "23";
char* ret = strstr(a, b);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
运行结果:
4.my_strstr模拟strstr函数实现
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
while (*s1!='\0'&&s2!='\0'&& * s1 == *s2)//每次对比一下,但是两个都不等于\0的情况下
{
s1++;
s2++;
}
if (*s2 == '\0')//如果s2在这里等于\0说明对比完了,找到直接返回
return p;
p++;
}
}
int main()
{
char a[] = "abcde";
char b[] = "bcd";
char* ret = my_strstr(a, b);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
这里的p是为了固定字符串的首地址,返回时直接从字符串首地址打印,s1与s2对比,全部对等时输出
运行结果:bcde
三、memcpy函数
1.memcpy函数声明
void* memcpy(void* str1, const void* str2, size_t n);
2.memcpy函数头文件
#include<stdio.h>
3.memcpy函数使用例
memcpy函数使用解释:从存储区str2复制n个字节到存储区str1
#include<stdio.h>
#include<string.h>
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int b[20] = { 0 };
memcpy(b, a, 20);//将a的值赋值给b
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", b[i]);
}
return 0;
}
运行结果:1 2 3 4 5
4.my_memcpy模拟memcpy函数实现
#include<stdio.h>
#include<string.h>
void* my_memcpy(void * dest, const void * str, size_t n)
{
void* ret = dest;
while (n--)
{
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
return ret;
}
int main()
{
char a[] = "hello";
char b[] = "world";
my_memcpy(a, b, strlen(b));//strlen函数计算字符串长度
printf("%s\n", a);
return 0;
}
该函数的实现通过一个字节一个字节的搬运,那直观的实现任何字节数的存储复制
四、memmove函数
1.memmove函数声明
void* memmove(void* dest, const void* src, size_t num);
2.memmove函数头文件
#include<stdio.h>
3.memmove函数使用例
函数使用解释:当数组1和数组2 所指的内存区域重叠时,memmove仍然可以复制覆盖,不过执行效率上会比使用 memcpy
#include<stdio.h>
#include<string.h>
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(a+2,a , 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
运行结果:1 2 1 2 3 4 5 8 9 10
4.my_memmove模拟memmove函数实现
#include<stdio.h>
void* my_memmove(void *dest,const char *str,size_t n)
{
void* ret = dest;
if (dest < str)//位置在后面时,从前到后覆盖
{
while (n--)
{
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
}
else //位置在开头,从后到前覆盖
{
while(n--)
{
*((char*)dest + n) = *((char*)str + n);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 20);
for(int i=0;i<10;i++)
printf("%d ", arr1[i]);
return 0;
}
注:memmove函数运行dest在str前就 从前到后覆盖
注:dest在str前就 从后到前覆盖