天天看点

常见库函数的实现

    1、strcpy

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. char * strcpy( char *strDest, const char *strSrc )          
  2. {         
  3.     if(strDest == strSrc) { return strDest; }      
  4.     assert( (strDest != NULL) && (strSrc != NULL) );         
  5.     char *address = strDest;          
  6.     while( (*strDest++ = * strSrc++) != '\0' );          
  7.     return address;         
  8. }    

    2、strncpy

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. <span style="font-size:18px;">char *strncpy(char *strDes, const char *strSrc, unsigned int count)          
  2. {          
  3.     assert(strDes != NULL && strSrc != NULL);          
  4.     char *address = strDes;          
  5.     while (count-- && *strSrc != '\0')          
  6.         *strDes++ = *strSrc++;       
  7.     *strDes = '\0';      
  8.     return address;          
  9. } </span>  

   3、strcmp

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. int strcmp(const char *s, const char *t)       
  2. {       
  3.     assert(s != NULL && t != NULL);       
  4.     while (*s && *t && *s == *t)       
  5.     {       
  6.         ++ s;       
  7.         ++ t;       
  8.     }       
  9.     return (*s - *t);       
  10. }   

    4、strcat

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. char *strcat(char *strDes, const char *strSrc)       
  2. {       
  3.     assert((strDes != NULL) && (strSrc != NULL));       
  4.     char *address = strDes;       
  5.     while (*strDes != '\0')       
  6.         ++ strDes;       
  7.     while ((*strDes ++ = *strSrc ++) != '\0')       
  8.         NULL;       
  9.     return address;       
  10. }   

    5、strlen

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. int strlen(const char *str)       
  2. {       
  3.     assert(str != NULL);       
  4.     int len = 0;       
  5.     while (*str ++ != '\0')       
  6.         ++ len;       
  7.     return len;       
  8. }    

    6、strstr

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. char *strstr(const char *strSrc, const char *str)       
  2. {       
  3.     assert(strSrc != NULL && str != NULL);       
  4.     const char *s = strSrc;       
  5.     const char *t = str;       
  6.     for (; *strSrc != '\0'; ++ strSrc)       
  7.     {       
  8.         for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)       
  9.             NULL;       
  10.         if (*t == '\0')       
  11.             return (char *) strSrc;       
  12.     }       
  13.     return NULL;       
  14. }     

    7、strncat

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. char *strncat(char *strDes, const char *strSrc, unsigned int count)       
  2. {       
  3.     assert((strDes != NULL) && (strSrc != NULL));       
  4.     char *address = strDes;       
  5.     while (*strDes != '\0')       
  6.         ++ strDes;       
  7.     while (count -- && *strSrc != '\0' )       
  8.         *strDes ++ = *strSrc ++;       
  9.     *strDes = '\0';       
  10.     return address;       
  11. }  

    8、strncmp

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. int strncmp(const char *s, const char *t, unsigned int count)       
  2. {       
  3.     assert((s != NULL) && (t != NULL));       
  4.     while (*s && *t && *s == *t && count --)       
  5.     {       
  6.         ++ s;       
  7.         ++ t;       
  8.     }       
  9.     return (*s - *t);       
  10. }  

    9、memcpy

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. void *memcpy(void *dest, const void *src, unsigned int count)       
  2. {       
  3.     assert((dest != NULL) && (src != NULL));       
  4.     void *address = dest;       
  5.     while (count --)       
  6.     {       
  7.         *(char *) dest = *(char *) src;       
  8.         dest = (char *) dest + 1;       
  9.         src = (char *) src + 1;       
  10.     }       
  11.     return address;       
  12. }   

    10、memccpy

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. void *memccpy(void *dest, const void *src, int c, unsigned int count)       
  2. {       
  3.     assert((dest != NULL) && (src != NULL));       
  4.     while (count --)       
  5.     {       
  6.         *(char *) dest = *(char *) src;       
  7.         if (* (char *) src == (char) c)       
  8.             return ((char *)dest + 1);       
  9.         dest = (char *) dest + 1;       
  10.         src = (char *) src + 1;       
  11.     }       
  12.     return NULL;       
  13. }   

    11、memcmp

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. int memcmp(const void *s, const void *t, unsigned int count)       
  2. {       
  3.     assert((s != NULL) && (t != NULL));       
  4.     while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)       
  5.     {       
  6.         s = (char *) s + 1;       
  7.         t = (char *) t + 1;       
  8.     }       
  9.     return (*(char *) s - *(char *) t);       
  10. }  

    12、memmove

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. //要处理src和dest有重叠的情况,不是从尾巴开始移动就没问题了。      
  2. //一种情况是dest小于src有重叠,这个时候要从头开始移动,      
  3. //另一种是dest大于src有重叠,这个时候要从尾开始移动。      
  4. void *memmove(void *dest, const void *src, unsigned int count)       
  5. {      
  6.     assert(dest != NULL && src != NULL);      
  7.     char* pdest = (char*) dest;      
  8.     char* psrc = (char*) src;      
  9.     //pdest在psrc后面,且两者距离小于count时,从尾部开始移动. 其他情况从头部开始移动      
  10.     if (pdest > psrc && pdest - psrc < count)       
  11.     {      
  12.         while (count--)       
  13.         {      
  14.             *(pdest + count) = *(psrc + count);      
  15.         }      
  16.     } else       
  17.     {      
  18.         while (count--)       
  19.         {      
  20.             *pdest++ = *psrc++;      
  21.         }      
  22.     }      
  23.     return dest;      
  24. }    

    13、memset

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. void *memset(void *str, int c, unsigned int count)       
  2. {       
  3.     assert(str != NULL);       
  4.     void *s = str;       
  5.     while (count --)       
  6.     {       
  7.         *(char *) s = (char) c;       
  8.         s = (char *) s + 1;       
  9.     }       
  10.     return str;       
  11. }  

    1、atoi

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. //inf用来标记作为判断是否越界  
  2. //atoiFlag作为是否是正确结果的返回值  
  3. const __int64 inf = (0x7fffffff);  
  4. int atoiFlag;  
  5. int atoi(const char* ch)  
  6. {  
  7.     ASSERT(ch != NULL);  
  8.     atoiFlag = false;  
  9.     while (*ch == ' ' || *ch == '\t')  
  10.         ch ++;  
  11.     int isMinus = 1;  
  12.     if (*ch == '-')  
  13.     {  
  14.         isMinus = -1;  
  15.         ch ++;  
  16.     }  
  17.     else if (*ch == '+')  
  18.     {  
  19.         ch ++;  
  20.     }  
  21.     //判断非法  
  22.     if (!(*ch <= '9' && *ch >= '0'))  
  23.         return 0;  
  24.     __int64 ans = 0;  
  25.     while (*ch && *ch <= '9' && *ch >= '0')  
  26.     {  
  27.         ans *= 10;  
  28.         ans += *ch - '0';  
  29.         //判断越界  
  30.         if (ans > inf)  
  31.         {  
  32.             return inf;  
  33.         }  
  34.         ch ++;  
  35.     }  
  36.     ans *= isMinus;  
  37.     atoiFlag = true;  
  38.     return (int)ans;  
  39. }  
  40. //如何使用  
  41. int main()  
  42. {  
  43.     char a[100];  
  44.     while (scanf("%s", a) != EOF)  
  45.     {  
  46.         int ans = atoi(a);  
  47.         if (atoiFlag)  
  48.             printf("%d\n", ans);  
  49.         else if (ans == inf)  
  50.             puts("The data of crossing the line");  
  51.         else  
  52.             puts("Not is a integer");  
  53.     }  
  54.     return 0;  
  55. }  

    2、itoa

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. #include <stdlib.h>   
  2. #include <stdio.h>   
  3. char *myitoa(int num,char *str,int radix);  
  4. int main()   
  5. {   
  6.     int number = -123456;   
  7.     char string[25];   
  8.     myitoa(number, string, 16);   
  9.     printf("integer = %d string = %s\n", number, string);   
  10.     return 0;   
  11. }   
  12. char *myitoa(int num,char *str,int radix)   
  13. {    
  14.     char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   
  15.     unsigned unum;    
  16.     int i=0,j,k;   
  17.     if(radix==10&&num<0)    
  18.     {   
  19.         unum=(unsigned)-num;   
  20.         str[i++]='-';   
  21.     }   
  22.     else unum=(unsigned)num;    
  23.     do    
  24.     {   
  25.         str[i++]=index[unum%(unsigned)radix];   
  26.         unum/=radix;   
  27.     }while(unum);   
  28.     str[i]='\0';   
  29.     if(str[0]=='-') k=1;    
  30.     else k=0;   
  31.     char temp;   
  32.     for(j=k;j<=(i-k-1)/2.0;j++)   
  33.     {   
  34.         temp=str[j];   
  35.         str[j]=str[i-j-1];   
  36.         str[i-j-1]=temp;   
  37.     }   
  38.     return str;   
  39. }   

    1、kmp

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. void getNext(const char* p, int next[])  
  2. {  
  3.     next[0] = -1;  
  4.     int index = 0;  
  5.     int p_l = strlen(p);  
  6.     for (int i=1; i<p_l; i++)  
  7.     {  
  8.         index = next[i-1];  
  9.         while (index >= 0 && p[index+1] != p[i])  
  10.         {  
  11.             index = next[index];  
  12.         }  
  13.         if (p[index+1] == p[i])  
  14.         {  
  15.             next[i] = index + 1;  
  16.         }  
  17.         else  
  18.         {  
  19.             next[i] = -1;  
  20.         }  
  21.     }  
  22. }  
  23. int kmp(const char* t, const char* p)  
  24. {  
  25.     const int t_l = strlen(t);  
  26.     const int p_l = strlen(p);  
  27.     int Next = new int[p_l + 1];  
  28.     getNext(p, Next);  
  29.     int p_index = 0, t_index = 0;  
  30.     int cnt = 0;  
  31.     while (p_index < p_l && t_index < t_l)  
  32.     {  
  33.         if (t[t_index] == p[p_index])  
  34.         {  
  35.             t_index ++;  
  36.             p_index ++;  
  37.         }  
  38.         else if (p_index == 0)  
  39.         {  
  40.             t_index ++;  
  41.         }  
  42.         else  
  43.         {  
  44.             p_index = Next[p_index-1] + 1;  
  45.         }  
  46.         if (p_index == p_l)  
  47.         {  
  48.             cnt ++;  
  49.             p_index = Next[p_index-1] + 1;  
  50.         }  
  51.     }  
  52.     delete[] Next;  
  53.     return cnt;  
  54. }  

    2、quicksort

[cpp]  view plain copy

常见库函数的实现
常见库函数的实现
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4. int partion(int a[], int p, int r)  
  5. {  
  6.     srand((unsigned)time(NULL));  
  7.     int e = rand()%(r-p+1)+p;  
  8.     int tmp = a[e];  
  9.     a[e] = a[r];  
  10.     a[r] = tmp;  
  11.     int x = a[r];  
  12.     int i, j;  
  13.     i = p;  
  14.     for (j=p; j<r; j++)  
  15.     {  
  16.         if (a[j] <= x)  
  17.         {  
  18.             tmp = a[i];  
  19.             a[i] = a[j];  
  20.             a[j] = tmp;  
  21.             i ++;  
  22.         }  
  23.     }  
  24.     tmp = a[r];  
  25.     a[r] = a[i];  
  26.     a[i] = tmp;  
  27.     return i;  
  28. }  
  29. void QuickSort(int a[], int p, int r)  
  30. {  
  31.     if (p < r)  
  32.     {  
  33.         int q = partion(a, p, r);  
  34.         QuickSort(a, p, q-1);  
  35.         QuickSort(a, q+1, r);  
  36.     }  
  37. }  
  38. int main()  
  39. {  
  40.     int a[] = {1,2,3,-1,5,-9,10,33,0};  
  41.     QuickSort(a, 0, 8);  
  42.     for (int i=0; i<9; i++)  
  43.     {  
  44.         printf("%d\t", a[i]);  
  45.     }  
  46.     return 0;  
  47. }