字符串操作&内存操作

来源:互联网 发布:巨人网络 刘伟 编辑:程序博客网 时间:2024/04/26 11:28

1、strcpy

char * strcpy( char *strDest, const char *strSrc )          {             if(strDest == strSrc) { return strDest; }          assert( (strDest != NULL) && (strSrc != NULL) );             char *address = strDest;              while( (*strDest++ = * strSrc++) != '\0' );              return address;         }

2、strncpy

char *strncpy(char *strDes, const char *strSrc, unsigned int count)          {              assert(strDes != NULL && strSrc != NULL);              char *address = strDes;              while (count-- && *strSrc != '\0')                  *strDes++ = *strSrc++;           *strDes = '\0';          return address;          }

3、strcmp

int strcmp(const char *s, const char *t)       {           assert(s != NULL && t != NULL);           while (*s && *t && *s == *t)           {               ++ s;               ++ t;           }           return (*s - *t);       } 

4、strcat

char *strcat(char *strDes, const char *strSrc)       {           assert((strDes != NULL) && (strSrc != NULL));           char *address = strDes;           while (*strDes != '\0')               ++ strDes;           while ((*strDes ++ = *strSrc ++) != '\0')               NULL;           return address;       }

5、strlen

int strlen(const char *str)       {           assert(str != NULL);           int len = 0;           while (*str ++ != '\0')               ++ len;           return len;       }

 6、strstr

char *strstr(const char *strSrc, const char *str)       {           assert(strSrc != NULL && str != NULL);           const char *s = strSrc;           const char *t = str;           for (; *strSrc != '\0'; ++ strSrc)           {               for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)                   NULL;               if (*t == '\0')                   return (char *) strSrc;           }           return NULL;       }

7、strncat

char *strncat(char *strDes, const char *strSrc, unsigned int count)       {           assert((strDes != NULL) && (strSrc != NULL));           char *address = strDes;           while (*strDes != '\0')               ++ strDes;           while (count -- && *strSrc != '\0' )               *strDes ++ = *strSrc ++;           *strDes = '\0';           return address;       }

8、strncmp

int strncmp(const char *s, const char *t, unsigned int count)       {           assert((s != NULL) && (t != NULL));           while (*s && *t && *s == *t && count --)           {               ++ s;               ++ t;           }           return (*s - *t);       }

9、memcpy

void *memcpy(void *dest, const void *src, unsigned int count)       {           assert((dest != NULL) && (src != NULL));           void *address = dest;           while (count --)           {               *(char *) dest = *(char *) src;               dest = (char *) dest + 1;               src = (char *) src + 1;           }           return address;       }

10、memccpy

void *memccpy(void *dest, const void *src, int c, unsigned int count)       {           assert((dest != NULL) && (src != NULL));           while (count --)           {               *(char *) dest = *(char *) src;               if (* (char *) src == (char) c)                   return ((char *)dest + 1);               dest = (char *) dest + 1;               src = (char *) src + 1;           }           return NULL;       }

11、memcmp

int memcmp(const void *s, const void *t, unsigned int count)       {           assert((s != NULL) && (t != NULL));           while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)           {               s = (char *) s + 1;               t = (char *) t + 1;           }           return (*(char *) s - *(char *) t);       } 

12、memmove

//@big:      //要处理src和dest有重叠的情况,不是从尾巴开始移动就没问题了。      //一种情况是dest小于src有重叠,这个时候要从头开始移动,      //另一种是dest大于src有重叠,这个时候要从尾开始移动。      void *memmove(void *dest, const void *src, unsigned int count)       {          assert(dest != NULL && src != NULL);          char* pdest = (char*) dest;          char* psrc = (char*) src;              //pdest在psrc后面,且两者距离小于count时,从尾部开始移动. 其他情况从头部开始移动          if (pdest > psrc && pdest - psrc < count)           {              while (count--)               {                  *(pdest + count) = *(psrc + count);              }          } else           {              while (count--)               {                  *pdest++ = *psrc++;              }          }          return dest;      } 

13、memset

void *memset(void *str, int c, unsigned int count)       {           assert(str != NULL);           void *s = str;           while (count --)           {               *(char *) s = (char) c;               s = (char *) s + 1;           }           return str;       }

14、atoi

//代码自己所写,不对地方请及时指正,谢谢!  //inf用来标记作为判断是否越界  //atoiFlag作为是否是正确结果的返回值  const __int64 inf = (0x7fffffff);  int atoiFlag;  int atoi(const char* ch)  {      ASSERT(ch != NULL);      atoiFlag = false;      while (*ch == ' ' || *ch == '\t')          ch ++;      int isMinus = 1;      if (*ch == '-')      {          isMinus = -1;          ch ++;      }      else if (*ch == '+')      {          ch ++;      }      //判断非法      if (!(*ch <= '9' && *ch >= '0'))          return 0;      __int64 ans = 0;      while (*ch && *ch <= '9' && *ch >= '0')      {          ans *= 10;          ans += *ch - '0';          //判断越界          if (ans > inf)          {              return inf;          }          ch ++;      }      ans *= isMinus;      atoiFlag = true;      return (int)ans;  }    //如何使用  int main()  {      char a[100];      while (scanf("%s", a) != EOF)      {          int ans = atoi(a);          if (atoiFlag)              printf("%d\n", ans);          else if (ans == inf)              puts("The data of crossing the line");          else              puts("Not is a integer");      }      return 0;  } </span>

15、itoa

#include <stdlib.h>   #include <stdio.h>   char *myitoa(int num,char *str,int radix);  int main()   {       int number = -123456;       char string[25];       myitoa(number, string, 16);       printf("integer = %d string = %s\n", number, string);       return 0;   }   /* 实现itoa函数的源代码 */   char *myitoa(int num,char *str,int radix)   {        /* 索引表 */       char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";       unsigned unum; /* 中间变量 */       int i=0,j,k;       /* 确定unum的值 */       if(radix==10&&num<0) /* 十进制负数 */       {           unum=(unsigned)-num;           str[i++]='-';       }       else unum=(unsigned)num; /* 其他情况 */       /* 逆序 */       do        {           str[i++]=index[unum%(unsigned)radix];           unum/=radix;       }while(unum);       str[i]='\0';       /* 转换 */       if(str[0]=='-') k=1; /* 十进制负数 */       else k=0;       /* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */       char temp;       for(j=k;j<=(i-k-1)/2.0;j++)       {           temp=str[j];           str[j]=str[i-j-1];           str[i-j-1]=temp;       }       return str;   }  





0 0