模拟常见的字符操作函数

来源:互联网 发布:如何成为一个网络作家 编辑:程序博客网 时间:2024/06/03 22:45

1.模拟strcpy(字符串拷贝函数)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dest,const char *src){   char *pc=dest;   assert(src);   assert(dest);   while(*dest++ = *src++)   {      ;   }   return pc;}int main(){   char *pa="abcdef";   char pb[10]={0};   my_strcpy(pb,pa);   printf("%s\n",pb);   system("pause");   return 0;}

strncpy:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strncpy(char *dest,const char *src,size_t n){   char *ret=dest;   assert(src);   assert(dest);   while(n--)   {       *ret++=*src++;   }   *ret='\0';//拷贝'\0'   return dest;}int main(){int num = 0;    char pa[]="abcdefgh";char pb[20]={0};char *ret=NULL;printf("请输入你要拷贝字符的个数:");scanf("%d",&num);ret=my_strncpy(pb,pa,num);printf("%s\n",ret);system("pause");return 0;}



2.模拟strlen(求取字符串长度)

//普通实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strlen(const char *src){   int count=0;   assert(src);   while(*src++)   {      count++;   }   return count;}int main(){   int ret=0;   char *pa="abcdefgh";   ret=my_strlen(pa);   printf("所求字符串的长度为:%d\n",ret);   system("pause");   return 0;}


//指针实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int my_strlen(const char *str){char *tmp=str;    while(*tmp++){;}return tmp-str-1;}int main(){    char *pa="abcdefgh";int ret = my_strlen(pa);printf("%d\n",ret);system("pause");return 0;}


//递归实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int my_strlen(const char *str){    if(!*str)return 0;else    return 1+my_strlen(str+1);}int main(){    char *pa="abcdefgh";int ret = my_strlen(pa);printf("%d\n",ret);system("pause");return 0;}


3.模拟strstr(在所给字符串中查找子串第一次出现的位置)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strstr(const char *str,const char *dest){   char *tmp=NULL;   const char *string1=str;   const char *string2=dest;   assert(str);   assert(dest);   if(!*string2)   {       return (char *)string1;   }   while(*string1)   {   tmp=(char *)string1;   while(*string1 && *string2 && *string1==*string2)   {       string1++;   string2++;   }   if(!*string2)   {       return (char *)tmp;   }   string1++;   }   return NULL;}int main(){   int result=0;   char *pa="abcdef";   char *pb="cde";   char *ret=my_strstr(pa,pb);   result=ret-pa+1;   if(NULL != ret)   {      printf("%s found at position %d\n",pb,result);   }   else   {      printf("%s not found\n",pb);   }      system("pause");   return 0;}

<span style="font-size:14px;">#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strstr(const char *dest,const char *src){const char *tmp = NULL;assert(dest);    assert(src);while(*dest && *src){tmp=src;while(*src && *dest==*src){src++;dest++;}if(!*dest){    return (char*)tmp;}src++;}return NULL;}int main(){    char *pa = "adcbdcdcbef";char *pb = "dcb";char *ret = my_strstr(pb,pa);if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该子串\n");}system("pause");return 0;}</span><span style="font-size: 24px;"></span>

strrstr:库中没有该函数,仿照strchrr实现(在所给字符串中查找子串最后一次出现的位置

<span style="font-size:14px;">#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strrstr(const char *dest,const char *src){const char *psrc = NULL;const char *pdest = dest;const char *tmp = NULL;assert(dest);    assert(src);while(*src){psrc=src;while(*src && *dest==*src){src++;dest++;}if(*dest == '\0'){tmp=psrc;}src=psrc;dest=pdest;src++;}if(tmp!=NULL){    return (char *)tmp;}return NULL;}int main(){    char *pa = "adcbdcb";char *pb = "dcb";char *ret = my_strrstr(pb,pa);if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该子串\n");}system("pause");return 0;}</span>


4.strcat(字符串连接)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcat(char *dest,const char *src){char *tmp=dest;  assert(dest);if(!*src){    return tmp;}while(*tmp){    tmp++;}while(*tmp++ = *src++){    ;}return dest;}int main(){   char *pa="efgh";   char pb[20]="abcd";   my_strcat(pb,pa);   printf("%s\n",pb);   system("pause");   return 0;}


<span style="font-size:14px;">#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strstr(const char *dest,const char *src){const char *tmp = NULL;assert(dest);    assert(src);while(*dest && *src){tmp=src;while(*src && *dest==*src){src++;dest++;}if(!*dest){    return (char*)tmp;}src++;}return NULL;}char *my_strrstr(const char *dest,const char *src){    const char *tmp = NULL;const char *psrc=NULL;const char *pdest=dest;assert(dest);    assert(src);while(*src){    tmp = my_strstr(pdest,src);if(tmp!=NULL){    psrc=tmp;src=tmp;}src++;}if(psrc!=NULL){    return (char *)psrc;}return NULL;}int main(){    char *pa = "adcbdcb";char *pb = "dcb";char *ret = my_strrstr(pb,pa);if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该子串\n");}system("pause");return 0;}</span>


strncat:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strncat(char *dest,const char *src,size_t n){   char *ret=dest;   assert(src);   assert(dest);   while(*ret)   {       ret++;   }   while(n--)   {       *ret++=*src++;   }   *ret='\0';//追加'\0'   return dest;}int main(){int num = 0;    char pa[20]="abcd";char pb[]="efgghhh";char *ret=NULL;printf("请输入你要追加字符的个数:");scanf("%d",&num);    ret=my_strncat(pa,pb,num);printf("%s\n",ret);system("pause");return 0;}


#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *my_strrstr(const char *dest,const char *src)//从后向前查找{    int len1=strlen(src);int len2=strlen(dest);const char*psrc=src;assert(dest);    assert(src);while(src+len1-1>src){while(*psrc)//先找到最后位置{psrc++;}while(*dest)//先找到最后位置{dest++;}while(--len1 && --len2 && *dest==*psrc){dest--;psrc--;}if(len2==0)return (char*)psrc-1;}return NULL;}int main(){    char *pa = "adcbdcb";char *pb = "dcb";char *ret = my_strrstr(pb,pa);if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该子串\n");}system("pause");return 0;}


5.strchr(在字符串中查找某个字符首次出现的位置)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strchr(const char *src,int ch){char *tmp=(char *)src;        assert(src);while(*tmp++){src=tmp;    if(*tmp == ch){    return (char *)src;}}return NULL;}int main(){   int ch='c';   char *pa="abcdef";   char *ret=my_strchr(pa,ch);   int result=ret-pa+1;   if(ret != NULL)   {   printf("Result:\tfirst %c found at position %d\n\n", ch, result);   }   else   {       printf("Result:\t%c not found\n",ch);   }   system("pause");   return 0;}

strrchr(在字符串中查找某个字符最后一次出现的位置)


<span style="font-size:18px;"><span style="font-size: 24px;">//从后向前找</span></span>
<span style="font-size:14px;">#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strrchr(const char *str,int ch){const char *tmp = str;    assert(str);while(*str++){        ;}while(--str>tmp){    if(*str == ch)return (char *)str;}return NULL;}int main(){    char *pa = "adbdcdef";char *ret = my_strrchr(pa,'d');  if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该字符\n");}system("pause");return 0;}</span>


//每次找到指定字符,先保存起来,最后返回该字符所在地址#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strrchr(const char *str,int ch){const char *tmp = NULL;    assert(str);while(*str){        if(*str==ch)tmp=str;str++;}if(tmp!=NULL)return (char*)tmp;return NULL;}int main(){    char *pa = "adcbdcdef";char *ret = my_strrchr(pa,'g');if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该字符\n");}system("pause");return 0;}


//通过strchr实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strchr(const char *str,int ch){    assert(str);while(*str){    if(*str == ch)return (char*)str;str++;}return NULL;}char *my_strrchr(const char *str,int ch){char *tmp = NULL;    assert(str);while(*str){if(*str == ch)        tmp = my_strchr(str,ch);str++;}if(tmp!=0)return (char*)tmp;return NULL;}int main(){    char *pa = "adcbdcdef";char *ret = my_strrchr(pa,'d');if(ret!=NULL){    printf("%s\n",ret);}else{    printf("没找到该字符\n");}system("pause");return 0;}

6.strcmp(字符串比较)

实现1:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *str1,const char *str2){    assert(1);assert(2);while(*str1 && *str2==*str1){    str1++;    str2++;}return *str1-*str2;}int main(){    char *pa="abczef";char *pb="abcfgjdh";int ret=my_strcmp(pa,pb);if(ret>0){   printf("%s greater than %s\n",pa,pb);}else if(ret==0){   printf("%s eaqul to %s\n",pa,pb);}else{   printf("%s less than %s\n",pa,pb);}system("pause");return 0;}


实现2:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *str1,const char *str2){int ret = 0;        assert(1);assert(2);while(!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2){        ++str1;++str2;}if(ret<0){    return -1;}else if(ret>0){    return 1;}return ret;}int main(){        char *pa="abcdef";char *pb="abcfgjdh";int ret=my_strcmp(pa,pb);if(ret>0){   printf("%s greater than %s\n",pa,pb);}else if(ret==0){   printf("%s eaqul to %s\n",pa,pb);}else{   printf("%s less than %s\n",pa,pb);}system("pause");return 0;}

strncmp:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strncmp(const char *str1,const char *str2,size_t n){   assert(str1);   assert(str2);  while(--n)  {  *str1++ == *str2++;  }  return (*str1-*str2);}int main(){int num = 0;int ret = 0;    char *pa="abcd";char *pb="abcf";printf("请输入你要比较字符的个数:");scanf("%d",&num);    ret=my_strncmp(pa,pb,num);if(ret>0){   printf("%s greater than %s\n",pa,pb);}else if(ret==0){   printf("%s eaqul to %s\n",pa,pb);}else{   printf("%s less than %s\n",pa,pb);}system("pause");return 0;}

7.memcpy:内存拷贝函数(两块内存不关联)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memcpy(void *dest,const void *src,size_t n){char *pdest=(char *)dest;const char *psrc=(const char *)src;  assert(dest);assert(src);while(n--){    *pdest++=*psrc++;}return dest;}int main(){int i = 0;  int arr1[20]={0};int arr2[]={1,2,3,4,5,6,7,8,9,0};int sz = sizeof(arr2)/sizeof(arr2[0]);    my_memcpy(arr1,arr2,sz);for(i=0; i<sizeof(arr2)/sizeof(arr2[0]); i++){    printf("%d ",arr2[i]);}system("pause");return 0;}
memmove:(两块内存有关联)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memmove(void *dest,const void *src,size_t n){char *pdest=(char *)dest;    const char *psrc=(char *)src;    assert(dest);assert(src);if(psrc+n>pdest && pdest>psrc)//从后向前拷贝{while(n--)    {*(pdest+n)=*(psrc+n);}}else//从前向后拷贝{     while(n--) {     *pdest++=*psrc++; }}return dest;}int main(){int i = 0;int num = 0;int arr2[]={1,2,3,4,5,6,7,8,9,0}; printf("请输入你要拷贝内存的大小:");scanf("%d",&num);        my_memmove(arr2+3,arr2+1,num*sizeof(int));for(i=0; i<sizeof(arr2)/sizeof(arr2[0]); i++){    printf("%d ",arr2[i]);}printf("\n");system("pause");return 0;}




old

http://blog.csdn.net/snow_5288/article/details/51147327

1 0