目录
strcat()
1.函数功能:在目标字符串后追加一个源字符串 char * strcat ( char * destination, const char * source );函数返回目标字符串的起始地址。2.实现原理:找到目标字符串末尾的'\0',将其覆盖追加源字符串 3.代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest,char* src)
{
assert(dest&&src);// 断言,防止过来的dest和src为控空指针
char* ret = dest; //接收一个返回指针
while (*dest)
{
dest++; //先找到目标字符串的'\0'位置
}
while (*dest++ = *src++)//覆盖'\0'的情况下追加源字符串
{
;
}
return ret;
}
int main()
{
char arr1[20]="abcd";
char arr2[] = "efgh";
/*my_strcat(arr1, arr2);*/
printf("%s", my_strcat(arr1, arr2));
return 0;
}
4.注意点:需要确保目标字符串有足够的空间,源字符串结尾应该有'\0'.
strcmp()
1.函数功能:比较字符串(比较的是内容而不是长度),
int strcmp ( const char * str1, const char * str2 );函数返回一个整型
2.实现原理:两字符串逐个比较,以ASCII的值相减,若相等结果为0,反之不为0
3.代码:
int my_strcmp(const char*s1,const char*s2)
{
assert(s1&&s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
return *s1 - *s2; //在系统中以ASCII码形式计算,返回一个整型值
}
int main()
{
//strcmp是比较字符串的内容,不是长度
char arr1[] = "abcd";
//char arr1[]="abq";
char arr2[] = "abcd";
if (my_strcmp(arr1, arr2) == 0) //相等,返回结果为0
{
printf("相同\n");
}
else
{
printf("不相同\n");
}
return 0;
}
strstr()
1.函数功能:在主串中判断子串是否存在,
char * strstr (char * str1, const char * str2 );放回值为主串中首次出现子串的地址
2.实现原理:主串和子串首字符比较,若不相同,主串向后移动一个字符,子串回到首字符位置,重复以往,直到子串或者主串出现'\0'
3.代码:
char* my_strstr(const char* str1,const char* str2) //在一个字符串中查找字符串
{
assert(str1 && str2);
char* s1;
char* s2;
char* cp = str1; //将主串首字符地址指向的指针赋给一个新创建的指针
while (*cp)
{
s1 = cp; //每次重新比较都需要将s1移动到主串首字符的地址处
s2 = str2; //每次重新比较s2需移动到子串首字符地址处
while (*s1 != '\0'&&*s2 != '\0'&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
//找不到
return NULL; //找不到子串返回空指针
}
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "abcd";
char* ret = (my_strstr(arr1, arr2));
if (ret != NULL)
{
printf("找到了\n");
}
else
{
printf("找到了\n");
}
return 0;
}
strcpy()
1.函数功能:将源字符串复制到目标字符串上并覆盖,
char * strcpy ( char * destination, const char * source );放回值为目标字符串的首字符地址
2.实现原理:定义两个指针分别指向目标字符串和源字符串首字符地址,逐个向后移动赋值
3.代码:
char* my_strcpy(char*dest ,char*src)
{
assert(dest && src);
char* ret = dest;
while (*src)
{
*dest = *src;
dest++;
src++;
}
return ret;
}
int main()
{
char arr1[20] = "abcdzz";
char arr2[] = "efgh";
char* ret = my_strcpy(arr1, arr2);
printf("%s", ret);
}
memcpy()
1.函数功能: 将源字符串的内存复制到目标字符串的内存中
void * memcpy ( void * destination, const void * source, size_t num );返回值为一个无类型指针
2.实现原理:确定源字符串占用内存的字节数,后逐一复制到目标字符串中
3.代码:
void* my_memcpy(void* dest, void* src, int num) //num为复制的内存大小
{
void* ret = dest;
assert(dest&&src);
int count = num;
while (count--)
{
*(char*)dest = *(char*)src; //强制转为char类型指针,助于每个字节复制
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 16); //my_memcpy(arr2, arr1, sz*sizeof(arr1[0]))
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
4.函数特点:但将同一个字符串的地址赋给两个指针,且复制范围和作用范围存在覆盖会出现特殊情况:
memmove()
1.函数功能:将同一个字符串的地址赋给两个指针,且复制范围和作用范围存在覆盖不会出现特殊情况
2.实现原理:分成两种情况,当目标地址比源地址低,从末端向前逐比特交换;当目标地址比源地址高,从前端向后逐比特交换
3.代码: