一.strcpy函数
char *strcpy( char *strDestination, const char *strSource );strcpy的头文件为
strcpy的用途:复制字符串,把源字符串src复制到目标字符串dest中,复制的时候包括\0也要复制过去;
int main()
{
char *arr = "abdcrf";
char arr2[20] = { 0 };
strcpy(arr2, arr);
printf("%s\n", arr2);
system("pause");
return 0;
}
实现函数
char * my_strcpy(char*dest,char*src)
{
assert(dest&&src);
while (*src != '\0')
{
*dest++ = *src++;
}
//return *dest;
}
int main()
{
char *arr = "abdcrf";
char arr2[20] = { 0 };
my_strcpy(arr2, arr);
printf("%s\n", arr2);
system("pause");
return 0;
}
二.strcat函数
char *strcat( char *strDestination, const char *strSource );
strcat函数返回类型为char *,头文件
功能:把src追加到dest上去;
int main()
{
char arr[30] = "abcdef";
char * arr2 = "www";//用指针追加每一个字节
strcat(arr, arr2);//把arr2追加到arr上;
printf("%s\n", arr);
system("pause");
return 0;
}
实现函数
char*my_strcat(char*dest, char*src)
{
assert(dest&&src);
char *start = dest;
while ( *dest !='\0')
{
dest++;
}
while (*dest = *src)
{
dest++;
src++;
}
return start;
}
int main()
{
char arr[30] = "abcdef";
char * arr2 = "www";//用指针追加每一个字节
my_strcat(arr, arr2);//把arr2追加到arr上;
printf("%s\n", arr);
system("pause");
return 0;
}
三.strcmp函数
int strcmp( const char *string1, const char *string2 );返回int
strcmp字符串比较大小,不比长度只比大小;
“abcdef” “aaaaaaaaaa”第一个a相同,第二个b>a
若 < 0 string1 less than string2
0 string1 identical to string2
> 0 string1 greater than string2
int main()
{
char *arr1 = "abcdef";
char * arr2 = "aaaaaaaa";
int i=strcmp(arr1, arr2);
printf("%d\n", i);//arr1>arr2返回>0的数
system("pause");
return 0;
}
实现函数
char * my_strcmp(char * str1,char* str2)
{
assert(str1&&str2);
分步,比较*str1与*str2,
while (*str1 == *str2)//二者相等往后判断
{
if (*str1 == '\0')//若*str1='\0'则str2也是;
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char *arr1 = "abcdef";
char * arr2 = "aaaaaaaa";
int i = my_strcmp(arr1, arr2);
printf("%d\n", i);//arr1>arr2返回>0的数
system("pause");
return 0;
}
四,strstr函数
char * strstr( const char *dest, const char *src );
strstr函数的头文件:
strstr返回src子字符串第一次出现在dest中的位置,从第一次出现输出dest
int main()
{
char* arr1 = "abderkgkg";
char* arr2 = "de";
printf("%s\n", strstr(arr1, arr2));
system("pause");
return 0;
}
实现函数
查找时,用两个指针指向arr1,arr2,以防动用dest,src找不到后回不去
char * my_strstr(const char * dest, const char * src)//查找
{
assert(dest&&src);
const char * s1 = (char *)dest;
const char * s2 = (char *)src;
const char * cur = (char *)dest;
if (*s2 == '\0')//此时src为空,直接返回dest
{
return (char*)dest;
}
while (*cur)//dest 为非0
{
s1 = cur;
s2 = src;
while (*s1 &&(*s1 == *s2)&& *s2)//非*s1为\0,*s2为\0
{
s1++;
s2++;
}
if (*s2 == '\0')//src比dest 提前结束
{
return *cur;//此时cur指向的是dest 与src开始相等时dest的起始位置,情况为二者相等,src先匹配结束
}
cur++;//二者此时不相等时,退回到上个位置,则cur需变化到下个二者相等时的初位置
}
return NULL;//此时*s1=='\0',dest中没有找到与src匹配的
}
int main()
{
char* arr1 = "abderkgkg";
char* arr2 = "de";
printf("%s\n", strstr(arr1, arr2));
system("pause");
return 0;
}
五,memcpy函数
void *memcpy( void *dest, const void *src, size_t count );
头文件 string,h
功能:内存拷贝,从src所指的内存的起始地址开始拷贝size_t个字节,到dest所指的内存的起始地址;
- -
strcpy与memcpy的区别:
(1)strcpy用于拷贝字符串,而memcpy可以拷贝任意函数
(2)strcpy遇到\0停下来,memcpy根据size_t来结束
size_t 为无符号整型;
void *p 无类型指针,可以接受任意字节,无类型指针不可解引用,不可++,不可–;
memcpy只能拷贝不重复的
int main()
{
char *arr1[8];
char * arr2 = "shhde";
memcpy(arr1, arr2,5*sizeof(char));
printf("%s\n", arr1);
system("pause");
return 0;
}
实现函数
void * my_memcpy(void * dest, const void * src, size_t count)
{
assert(dest&&src);
char * str = dest;
while (count--)
{
*(char *)dest = *(char *)src;//强制类型转换
dest=(char*)dest+1;//不可换成++,++优先级比强制类型大
src = (char *)src + 1;
}
return str;
}
int main()
{
char *arr1[8];
char * arr2 = "shhde";
my_memcpy(arr1, arr2, 5 * sizeof(char));
printf("%s\n", arr1);
system("pause");
return 0;
}
memmove 函数
void *memmove( void *dest, const void *src, size_t count );
由src所指内存区域复制count个字节到dest所指内存区域,
dest与src所指区域可以重叠,复制后dest内容会更改,函数返回指向dest的指针;
实现函数
void * my_memmove(void * dest, void *src, size_t count)
{
assert(dest&&src);
char *ret = dest;
//分为两组,dest在src之前,放为一组,从前往后,
//dest在src+count之后或dest在src与src+count之间放为一组;
if (dest < src)//if((dest<src)||((char *)dest>(char *)src+count))不同分组
{//从前往后
while (count--)
{
*(char *)dest = *(char *)src;
dest = (char*)dest+1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);//src+count为src的最后赋给dest的最后,dest的最后也是dest+count
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
my_memmove(arr1, arr1+2, 16);
system("pause");
return 0;
}