标签:strstr-strcmp-str-cpy-strcat-strncat-memmove-memcpy函数的实现
(1)strstr寻找子字符串函数的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
#include <assert.h>
typedef unsigned int uint;
char *my_strncat(char *dest, const char *src, uint count);
{
/*my_strncat实现两个相同字符串的链接,
因为在这里如果用strcat函数永远找不到原字符串的结束标志
所以程序将陷入死循环,但是用strncat能够很好的避免这一现象的发生*/
assert(dest);//检测指针的有效性
assert(src);
char *ret = dest;
while(*dest)
{
dest++;
}
while(count--)
{
*dest++=*src++;
}
*dest=‘\0‘;
return ret;
}
char *my_strstr(const char *str1,const char *str2)//因为在匹配过程中两个字符串不发生改变,所以要用const修饰它
{
char *ptr=str1;
char *p1=NULL;
char *p2=NULL;//
while(*ptr)//当*ptr所指向的内容不为\0时将p1=ptr;p2=str2,外层循环控制str1中的字符遍历
{
p1=ptr;
p2=str2;
while((*p1)&&(*p1==*p2))
/*当p1所指向的内容不为\0并且p1,p2相等时
接着比较两个字符串的中下一个字符,以次循环,
直到p2所指向的str2为\0时说明查找成功,
否则给ptr++来指向str1中的下一个字符,此时p2=str1继续匹配
直到str1预见\0时匹配失败,返回null*/
{
p1++;
p2++;
if(*p2==‘\0‘)
return ptr;
}
ptr++;
}
return NULL;
}
int main()
{
char arr[20] = "abcdef";//abcdefabcdef
char *p = "cdefab";
int len = strlen(arr);//求字符串长度
my_strncat(arr, arr, len);//实现两个相同字符串的链接
char *ch = my_strstr("ABBBCDEF", "BCD");
if (ch!= NULL)
{
printf("%p\n", ch);
printf("%s\n", ch);
}
else
{
printf("not exist\n");
}
printf("%s\n", arr);
return 0;
}
(2) 单个Strstr函数的实现
#include <stdio.h>
#include <stdlib.h>
char *my_strstr(const char *str1, const char *str2)
{char *ret = NULL;
char *start = str1;
char *p = str1;
char *q = str2;
while (*start++)
{
ret = start;
while (*p++ == *q++)
{
if (*q != ‘\0‘)
{
return ret;
}
}
p = start;
q = str2;
}
return NULL;
}
int main()
{char *str = "ABBCDEF";
char *ch = "BCD";
printf("%s\n", my_strstr(str, ch));
system("pause");
return 0;
}
(2)strcpy函数的实现
#include <stdio.h>
char *my_strcpy(char *strDest ,const char *strsrc)
{
char *address=strDest;
while(*strsrc)
{
*strDest++=*strsrc++;
}
*strDest=‘\0‘;
return address;
}
int main()
{
char *str1="abcde";
char str2[20];
my_strcpy(str2 ,str1);
printf("%s\n",str2);
return 0;
}
(3)Strcmp函数的实现
#include <stdio.h>
int my_strcmp(const char *s1 ,const char *s2)
{
while(*s1||*s2) //如果S1和S2比较完毕 (‘\\0’)跳出循环;
{
if(*s1-*s2) //判断S1和S2对应的字符是不是不同;
return *s1-*s2; //如果不同,返回S1和S2的ASCII之差;
else // 如果相同,让指针指向S1和S2的下一个字符比较
{
s2++;
s1++;
}
}
return 0; // S1和S2相等的时候返回0
}
int main()
{
char *buf1="aaa";
char*buf2="BBB";
int ptr;
ptr=my_strcmp(buf2 ,buf1);
printf("%d\n",ptr);
return 0;
}
(5)strcat函数的实现
#include <stdio.h>
char *my_strcat(char *strDest,const char *strsrc)
{char*address=strDest;
while(*strDest)
{
strDest++;
}
while(*strDest++= *strsrc++)
{
NULL;
}
return address;
}
int main()
{ char str1[20]="abc";
char str2[5]="def";
my_strcat(str1,str2);
printf("%s",str1);
return 0;
}
(6)memmove
函数原型:void *memmove(void *dest, const void *source, size_t count)
返回值说明:返回指向dest的void *指针
参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数
函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
(7)memcpy
函数原型:void *memcpy(void *dest, const void *source, size_t count);
返回值说明:返回指向dest的void *指针
函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。
两者区别
函数memcpy() 从source 指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。
而memmove(),如果两函数重叠,赋值仍正确进行。
memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;
如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。
memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void* my_memmove(void *dest, const void *src, size_t count)
/*size _t 为了增强程序的可移植性,便有了size_t ,
不同系统上,定义size_t可能不一样。
经测试发现,在32位系统中size_t是4字节的,
在64位系统中,size_t是8字节的,
这样利用该类型可以增加程序移植性。*/
{assert(dest);assert(src);
void *ret = dest;
char *p = (char *)dest;
char *q = (char *)src;//内存重叠
if ((p > q) && (p < q + count))
{while (count--)
{*(p + count) = *(q + count);}
}
else //内存不重叠
{while (count--)
{*p++ = *q++;}
}return ret;
}
int main()
{
int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
my_memmove(arr + 5, arr + 2, 16);
for (i = 0; i < 4; i++)
{printf("%d\n", arr[i]);}
system("pause");
return 0;
}
memcpy
#include <stdio.h>
void *my_memcpy(void *dest,void *src,size_t count)
{
void *ret=dest;
char *p=(char*)dest;
char *q=(char*)src;
while(count--)
{
*p++=*q++;
}
return ret;
}
int main()
{
int i;
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int arr1[8]={0};
my_memcpy(arr1,arr+2,16);
for(i=0;i<4;i++)
printf("%d ",arr1[i]);
return 0;
}
strstr-strcmp-str-cpy-strcat-strncat-memmove-memcpy函数的实现
标签:strstr-strcmp-str-cpy-strcat-strncat-memmove-memcpy函数的实现
原文地址:http://10808695.blog.51cto.com/10798695/1719055