Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1681018
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-07-09 09:12:20

原文地址:字符串处理函数的实现 作者:elivans

1. strlen函数

点击(此处)折叠或打开

  1. //返回字符串的长度
  2. int my_strlen(const char *str)
  3. {
  4.     int i = 0;
  5.     for(;*str++ != '\0';i++);
  6.     return i;
  7. }
2. strcpy函数

点击(此处)折叠或打开

  1. //strSrc指向的字符串拷贝到strDest
  2. char * strcpy( char *strDest, const char *strSrc )
  3. {
  4.     assert((strDest != NULL) && (strSrc != NULL));
  5.     char *address = strDest;
  6.     while((*strDest++ = *strSrc++) != '\0');
  7.     return address;
  8. }

3.字符串循环右移函数

点击(此处)折叠或打开

  1. //strSrc指向的字符串循环右移n个字符后保存到strDest中并返回
  2. char * circulate_right_move(char *strDest,const char *strSrc,const int n)
  3. {
  4.     assert( (strDest != NULL) && (strSrc != NULL));
  5.     
  6.     char * address = strDest;
  7.     int len = strlen(strSrc);
  8.     int offset = n % len;
  9.     
  10.     strSrc += (len - offset);
  11.     
  12.     for(;(*strDest = *strSrc) != '\0';strDest++,strSrc++);
  13.     
  14.     strSrc -= len;    
  15.     
  16.     for(int i = 0; i < len - offset; i++)
  17.     {
  18.         *strDest = *strSrc;
  19.         strDest++;
  20.         strSrc++;
  21.     }
  22.     
  23.     *strDest = '\0';

  24.     return address;
  25. }

4.字符串逆序函数


点击(此处)折叠或打开

  1. //strSrc指向的字符串逆序保存到strDest并返回
  2. char * str_reverse( char *strDest, const char *strSrc )
  3. {
  4.     assert((strDest != NULL) && (strSrc != NULL));
  5.     
  6.     char *address = strDest;
  7.     
  8.     int n = strlen(strSrc);
  9.     strSrc += (n-1);
  10.     
  11.     for(; n > 0; n--)
  12.     {
  13.         *strDest = *strSrc;
  14.         strDest++;
  15.         strSrc--;
  16.     }
  17.     
  18.     *strDest = '\0';

  19.     return address;
  20. }

5.strcat函数


点击(此处)折叠或打开

  1. //strSrc字符串连接到strDest后面并返回
  2. char * strcat( char *strDest, const char *strSrc )
  3. {
  4.     assert((strDest != NULL) && (strSrc != NULL));
  5.     
  6.     char *address = strDest;
  7.     
  8.     int lenDest = strlen(strDest);
  9.     
  10.     strDest += lenDest;
  11.     
  12.     while( (*strDest++ = *strSrc++) != '\0');

  13.     *strDest = '\0';

  14.     return address;
  15. }

6.strtok函数


点击(此处)折叠或打开

  1. char *strtok_r(char *s, const char *delim, char **save_ptr)
  2. {
  3.     char *token;
  4.   
  5.     if (s == NULL)
  6.         s = *save_ptr;
  7.   
  8.     s += strspn(s, delim);
  9.     if (*s == '\0')
  10.         return NULL;
  11.   
  12.     token = s;
  13.     s = strpbrk(token, delim);
  14.     
  15.     if (s == NULL)
  16.         *save_ptr = strchr(token, '\0');
  17.     else {
  18.         *s = '\0';
  19.         *save_ptr = s + 1;
  20.     }
  21.   
  22.     return token;
  23. }

  24. char *strtok(char *s, const char *delim)
  25. {
  26.     static char *last;
  27.   
  28.     return strtok_r(s, delim, &last);
  29. }

7.strspn函数


点击(此处)折叠或打开

  1. //返回字符串str1中第一个不在指定字符串str2中出现的字符下标
  2. /*
  3. 例:
  4. char *str1 = "a b c d e f";
  5. char *str2 = "a b c"; or char *str2 = "a b c ";

  6. strspn(str1,str2) = 6
  7. 因为
  8. str1[6] = 'd'
  9. */

  10. size_t strspn(const char *str1, const char *str2)
  11. {
  12.     const char *p_str1;
  13.     const char *a_str2;
  14.     
  15.     size_t count = 0;
  16.     
  17.     for (p_str1 = str1; *p_str1 != '\0'; p_str1++)
  18.     {
  19.         for (a_str2 = str2; *a_str2 != '\0'; a_str2++)
  20.         {
  21.             if (*p_str1 == *a_str2)
  22.                 break;
  23.         }
  24.         if (*a_str2 == '\0')
  25.             return count;
  26.         count++;
  27.     }
  28.     
  29.     return count;
  30. }

阅读(221) | 评论(0) | 转发(0) |
0

上一篇:用户内核无界访问

下一篇:vim

给主人留下些什么吧!~~