string 函数

来源:互联网 发布:神话软件怎么用 编辑:程序博客网 时间:2024/05/21 10:23

str系列函数,用的少,经常忘记,记录一下。

头文件

#include <string.h>

strcoll 按照指定locale设置比较两个字符串
strdec 比较两字符串,返回指定字符串地址
strcat 把字符串加另一字符串
strchr 在字符串中寻找指定字符
strcmp 比较两字符串
strcspn 在字符串s1中寻找s2中所出现的字符,返回s2中出现的第一个字符在s1中出现的位置(有点拗口)
strdup 复制字符串,即clone
strcmp 比较字符串,忽略大小写
strlen 获取字符串长度
strlwr 把字符串转换为小写
strncat 是strcat的加强版,增加了缓冲区控制
strpbrk 在s1中寻找s2中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内
strrev 翻转字符串
strset 设置字符串中某一位置的字符为指定字符
strstr 在字符串s1中寻找字符串s2
strtok 在字符串中找分隔符

1、strcat()


此函数原型为 char *strcat(char *dest, const char *src).
功能为连接两个字符串,把src连接到dest后面;返回dest地址
实现如下

char * strcat(char *dest,const char *src)  {      char* addr=dest;      while(*dest)//找到'\0'      {          dest++;      };      while(*dest++=*src++)      {};      return addr;  }  

2、strcmp()

此函数的函数原型为 int strcmp(const char *str1, const char *str2).
功能为比较两个字符串。
当str1指向的字符串大于str2指向的字符串时,返回正数。
当str1指向的字符串等于str2指向的字符串时,返回0。
当str1指向的字符串小于str2指向的字符串时,返回负数。
实现如下:

int strcmp(const char *str1, const char *str2)  {      while(*str1==*str2)      {          if(*str1=='\0')              return 0;          str1++;          str2++;      }      return *str1-*str2;  }  

3、strcpy()

此函数原型为 char strcpy(char dest, const char *src)
功能为拷贝字符串内容到目的串,把src所指向的内容拷贝到dest
实现如下

char *strcpy(char *dest,const char *src)  {      //assert(dest!=NULL&&src!=NULL);      char *addr=dest;      while(*dest++=*src++);      return addr;  }  

4、strlen()

此函数原型为unsigned in strlen(const char *str)
功能为返回字符串str的长度(不包括’\0’)。
实现如下:

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

5、strchr() strrchr()

char *strchr(char *str, char c)
功能为查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL。实现如下:

char *strchr(char *str, char c)  {      while(*str!='\0'&&*str!=c)      {          str++;      }      return (*str==c? str: NULL);  } 

char *strrchr(char *str, char c)
功能为查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL。实现如下:

char *strrchr(char *str, char c)  {      char *p=str+strlen(str);//p指向最后一个字符      while(p!=str&&*p!=c)      p--;      if(p==str&&*p!=c)          return NULL;      else return p;  }  

6、strcspn() strspn()

strspn() 函数用来计算字符串 str 中连续有几个字符都属于字符串 accept,其原型为:
size_t strspn(const char str, const char accept);
【函数说明】strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 accept 所指字符串中的字符。简单的说,若 strspn() 返回的数值为n,则代表字符串 str 开头连续有 n 个字符都是属于字符串 accept 内的字符。
【返回值】返回字符串 str 开头连续包含字符串 accept 内的字符数目。所以,如果 str 所包含的字符都属于 accept,那么返回 str 的长度;如果 str 的第一个字符不属于 accept,那么返回 0。
注意:检索的字符是区分大小写的。
提示:提示:函数 strcspn() 的含义与 strspn() 相反。

实现十分巧妙,在http://blog.csdn.net/chenyu2202863/article/details/5293941
原型:size_t strcspn(const char *pstr, const char *strCharset)
MSDN解释为:在字符串pstr中搜寻strCharsret中所出现的字符,返回strCharset中出现的第一个字符在pstr中的出现位置。简单的说,若strcspn返回的数值为n,则代表字符串strCharsrt开头连续有n个字符不包含在pstr内的字符。

/***int strcspn(string, control) - search for init substring w/o control charsPurpose:       returns the index of the first character in string that belongs       to the set of characters specified by control.  This is equivalent       to the length of the length of the initial substring of string       composed entirely of characters not in control.  Null chars not       considered.Entry:      char *string - string to search      char *control - set of characters not allowed in init substringExit:      returns the index of the first char in string      that is in the set of characters specified by control.   Uses:Exceptions:***/inline int StrCSpn(const Char *pStr, const Char *pStrSet){ // map32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]    unsigned char map[32] = {0};    // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111)),    //5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在    while(*pStrSet)    {        map[*pStrSet >> 3] |= (1 << (*pStrSet & 7));        pStrSet++;    }    map[0] |= 1;    int count = 0;    while(!(map[*pStr >> 3] & (1 << (*pStr & 7))))    {        count++;        pStr++;    }    return count;}

例如:对于字符’1’,其ASCII码味0x31,右移3位得到6,和7与运算得到1,也就是在map[6]中的第一位.

一个unsigend char有8位,拆为高5位与低3位。前5位的范围有0~32,所以申请32大小的数组map。直接将前5位映射成成数组下标,后3位范围0~7,正好是每一项char(8bit)。这个算法把时间与空间结合起来,效率非常高。

7、strdup()

此函数原型为char *strdup(const char *str)
功能为拷贝字符串到新建的内存,返回内存指针。若失败,返回NULL。要注意,返回的指针指向的内存在堆中,所以要手动释放。
函数实现:

 char *strdup(const char *str)    {        char *p=NULL;        if(str&&(p=(char*)malloc(strlen(str)+1)))            strcpy(p,str);        return p; }

8、strrev()

此函数的原型为char *strrev(char *str)
功能为反转字符串,返回字符串指针。
函数实现:

char *strrev(char *str)  {      if(str==NULL)          return NULL;      char *start=str;      char *end=str+strlen(str)-1;      char temp;      while(start<end)      {          temp=*start;          *start=*end;          *end=temp;          start++;          end--;      }      return str;  } 

9、strstr()

函数原型为char *strstr(const char str1, const char *str2)
功能为查找字符串str2在str1中出现的位置,找到则返回位置,否则返回NULL。
函数实现:

char *strstr(const char str1, const char *str2)  {      int length1=strlen(str1);      int length2=strlen(str2);      while(length1>=length2)      {          length1--;          if(!strncmp(str1,str2,length2))//比较前n个字符串,类似strcmp              return str1;          str1++;      }      return NULL;  }

10 、strpbrk()

char*strpbrk( const char *string, const char *strCharSet );
用途:在源字符串(string)中找出最先含有搜索字符串(strCharSet )中的任一字符的位置并返回,若找不到则返回空指针

inline Char *StrPbrk(Char *pStr, Char *pStrSet){ // map有32个字节,就是256个bit的大小,可把map堪称一个2维数组[32][8]    unsigned char map[32] = {0};    // 每个ASCII码(设为c)有8bit,把它分为2部分,低3位构成下标j(通过c & 7得到),高5位构成下标i(通过c >> 3得到)// 这样在map[i][j]中置1代表有字符存在    while(*pStrSet)    {        map[*pStrSet >> 3] |= (1 << (*pStrSet & 7));        pStrSet++;    }    while(*pStr)    {        // 如果有相同的字符则返回        if( map[*pStr >> 3] & (1 << (*pStr & 7)) )            return pStr++;        pStr++;    }    // 没有相同的字符返回NULL    return NULL;}

StrPbrk与Strcspn的算法一样,只是前者返回相同字符的指针位置,后者返回相同字符的个数。

11、strlwr() strupr()

strlwr的原型为:char *strlwr(char *str)

strupr的原型为:char *strupr(char *str)

长得都差不多,返回值也都是经过处理的字符串指针。

Char *tStrLwr(Char *pStr){    for(Char *cp = pStr; *cp != _T('/0'); ++cp)    {        if( _T('A') <= *cp && *cp <= _T('Z') )            *cp += _T('a') - _T('A');    }    return pStr ;}Char *StrUpr(Char *pStr){    for(Char *cp = pStr; *cp; ++cp)        if( (_T('a') <= *cp) && (*cp <= _T('z')) )            *cp -= _T('a') - _T('A');    return pStr;}

很简单,就是利用循环把每个字符做出相应的调整。如果是转换为大写,就减去‘a’ - ‘A’的值,如果是转换为小写则加上‘a’ -‘A’的值。

0 0
原创粉丝点击