码迷,mamicode.com
首页 > 其他好文 > 详细

strstr-strcmp-str-cpy-strcat-strncat-memmove-memcpy函数的实现

时间:2015-12-03 02:20:58      阅读:174      评论:0      收藏:0      [点我收藏+]

标签: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 *= str1;

char *= str2;

while (*start++)

{

ret = start;

while (*p++ == *q++)

{

if (*!= ‘\0‘)

{

return ret;

} 

}

= start;

= 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) //如果S1S2比较完毕 (‘\\0’)跳出循环; 

 { 

  if(*s1-*s2) //判断S1S2对应的字符是不是不同; 

   return *s1-*s2; //如果不同,返回S1S2ASCII之差; 

  else // 如果相同,让指针指向S1S2的下一个字符比较 

  {

   s2++;

   s1++

  }

 } 

 return 0; // S1S2相等的时候返回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)

返回值说明:返回指向destvoid *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

 

(7)memcpy

 

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向destvoid *指针

函数说明:memcpy功能和memmove相同,但是memcpydestsource中的区域不能重叠,否则会出现未知结果。

 


两者区别

  函数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_t4字节的,

64位系统中,size_t8字节的,

这样利用该类型可以增加程序移植性。*/

{assert(dest);assert(src);

void *ret = dest;

char *= (char *)dest;

char *= (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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!