strcspn函数

来源:互联网 发布:网络市场调研的概念 编辑:程序博客网 时间:2024/06/06 01:55

/*
strcspn
原型:size_t strcspn(const char *s1,const char *s2);
相关头文件:string.h
功能:顺序在字符串s1中搜寻与s2中字符的第一个相同字符,包括结束符NULL,返回这个字符在S1中第一次出现的位置。
说明:(返回字符串s1中第一个在s2中出现的字符在s1中的下标值,亦即在s1中出现而s2中没有出现的子串的长度。)

这个可以看做是strchr函数的字符串版,很明显得设立两个指针,同时来遍历s1和s2.

*/

 

#include <stdio.h>size_t strcspn(const char *s1, const char *s2){const char *p;    //设立两个同类型的指针const char *r;size_t count = 0;  //返回值for (p = s1; *p!= '\0'; p++){for (r = s2; *r != '\0'; r++){if (*r == *p){return count;//找到字符则返回。}}++count;//因为是返回这个字符在S1中第一次出现的位置,所以指针p每移动一次,count+1;}return count;//没有找到则返回空字符在S1中出现的位置}int main (){  char str[] = "fcba73";  char keys[] = "12a4560890";  int i;  i = strcspn(str,keys);  printf ("The first number in str is at position %d.\n",i+1);  return 0;}


//linux源码

size_t strcspn(const char *s, const char *reject)  {      const char *p;      const char *r;      size_t count = 0;        for (p = s; *p != '\0'; ++p) {          for (r = reject; *r != '\0'; ++r) {              if (*p == *r)                  return count;          }          ++count;      }      return count;  }


 

 

**FUNCTION<<strcspn>>---count characters not in stringINDEXstrcspnANSI_SYNOPSISsize_t strcspn(const char *<[s1]>, const char *<[s2]>);TRAD_SYNOPSISsize_t strcspn(<[s1]>, <[s2]>)char *<[s1]>;char *<[s2]>;DESCRIPTIONThis function computes the length of the initial part ofthe string pointed to by <[s1]> which consists entirely ofcharacters <[NOT]> from the string pointed to by <[s2]>(excluding the terminating null character).RETURNS<<strcspn>> returns the length of the substring found.PORTABILITY<<strcspn>> is ANSI C.<<strcspn>> requires no supporting OS subroutines. */#include <string.h>size_t_DEFUN (strcspn, (s1, s2),_CONST char *s1 _AND_CONST char *s2){  _CONST char *s = s1;  _CONST char *c;  while (*s1)    {      for (c = s2; *c; c++){  if (*s1 == *c)    break;}      if (*c)break;      s1++;    }  return s1 - s;    //利用指针的特性,少了一个临时变量}


 

 

//这个程序太精妙了,很值得学习

size_t strcspn( const char * str1, const char * str2 ){int count = 0;// map有32个字节的大小,也就是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表示字符存在// 对于字符’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)。这个算法把时间与空间结合起来,效率非常高。    while(*str2)    {        map[*str2 >> 3] |= (1 << (*str2 & 7));        str2++;    }    map[0] |= 1;        while(!(map[*str1 >> 3] & (1 << (*str1 & 7))))    {//如果s1中没有        count++;        str1++;    }    return count;}


 

 

 

原创粉丝点击