字符串函数strspn、strcspn和strpbrk

strspn函数

头文件#include <string.h>
函数原型size_t strspn( const char *str, const char *strCharSet );
参数:str、strCharSet 为要进行查找的两个字符串。
返回值:返回字符串 str 开头连续包含字符串 strCharSet内的字符数目。所以,如果 str 所包含的字符都属于strCharSet,那么返回 str 的长度;如果 str 的第一个字符不属于 strCharSet,那么返回 0。
函数说明: strspn() 函数用来计算字符串 string 中连续有几个字符都属于字符串 strCharSet。
strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 strCharSet 所指字符串中的字符。简单的说,若 strspn() 返回的数值为n,则代表字符串 str 开头连续有 n 个字符都是属于字符串 strCharSet 内的字符。
注意:检索的字符是区分大小写的。
提示:提示:函数 strcspn() 的含义与 strspn() 相反,可以对比学习。
示例
例1:

#include <stdio.h>
#include <string.h>

int main ()
{
  int i;
  char str[] = "129th";
  char strCharSet[] = "1234567890";
  i = strspn(str, strCharSet);
  printf("str 前 %d 个字符都属于 strCharSet\n",i);
  return 0;
}

输出结果
str 前 3 个字符都属于 strCharSet

例2:

#include <string.h>
#include <stdio.h>

int main( void )
{
   char string[] = "cabbage";
   int  result;
   result = strspn( string, "abc" );
   printf( "The portion of '%s' containing only a, b, or c "
           "is %d bytes long\n", string, result );
   printf("string:%s\n",string+result);
   return 0;
}

输出结果
The portion of ‘cabbage’ containing only a, b, or c is 5 bytes long
string:ge

自己实现strspn函数
strspn()函数从名称上来讲属于字符串查找,但实际应用中发现strspn()函数用来在一个字符串中从首地址开始向后递增排查”添加的参数”在这个字符串的范围是多少个字节。
函数声明如下

size_t strspn(const char *str, const char *strCharSet);

函数定义和实现如下

size_t my_strspn(const char *str, const char *strChaSet)
{
    const char *p;
    const char *s;
    size_t count = 0;

    for (p = str; *p != '\0'; ++p) {
        for (s = strChaSet; *s != '\0'; ++s) {
            if (*p == *s)
                break;
        }
        if (*s == '\0')
            return count;
        ++count;
    }
    return count;
}

实现原理:
1.排查的范围从str的首地址开始到尾地址结束;
2.如果strCharSet参数有5个字符,第一个字符查到count+1,第五个字符查到count也是+1;
3.如果strCharSet参数所有字符都排查过了还是没有找到与str相关的字节,那么退出函数,返回0。
4.每次查找到strCharSet相对于的字符,在下一次查找时(最外层for循环还在继续运行),strCharSet参数从首字符开始。

strcspn函数

头文件#include <string.h>
函数原型size_t strcspn( const char *string, const char *strCharSet );
参数:str、strCharSet 为要进行查找的两个字符串。
返回值:返回字符串 str 开头连续不含字符串 strCharSet内的字符数目。所以,如果 str 所包含的字符都不属于strCharSet,那么返回 str 的长度;如果 str 的第一个字符属于 strCharSet,那么返回 0。
函数说明:strcspn() 用来计算字符串 string 中连续有几个字符都不属于字符串 strCharSet。
strcspn() 从字符串 str 的开头计算连续的字符,而这些字符都完全不在字符串 strCharSet 中。简单地说,若 strcspn() 返回的数值为 n,则代表字符串 str 开头连续有 n 个字符都不含字符串 strCharSet 中的字符。
示例
例1:

#include <stdio.h>
#include <string.h>

int main()
{
  char* s1 = "http://c.biancheng.net/cpp/u/biaozhunku/";
  char* s2 = "c is good";
  int n = strcspn(s1,s2);
  printf("The first char both in s1 and s2 is :%c\n",s1[n]); 
  printf("The position in s1 is: %d\n",n);
  return 0;
}

输出结果
The first char both in s1 and s2 is :c
The position in s1 is: 7

例2:判断两个字符串的字符是否有重复的。

#include <stdio.h>
#include <string.h>

int main()
{
  char* s1 = "http://c.biancheng.net/cpp/xitong/";
  char* s2 = "z -+*";
  if(strlen(s1) == strcspn(s1,s2)){
    printf("s1 is diffrent from s2!\n");
  }else{
    printf("There is at least one same character in s1 and s2!\n");
  }
  return 0;
}

输出结果
s1 is diffrent from s2!

strpbrk函数

头文件#include <string.h>
函数原型char *strpbrk( const char *str, const char *strCharSet );
参数
str – 要被检索的 C 字符串。
strCharSet – 该字符串包含了要在 str 中进行匹配的字符列表。
返回值:该函数返回 str中第一个匹配字符串 strCharSet中字符的字符位置,如果未找到字符则返回 NULL。
函数说明: strpbrk函数用来检索字符串 str中第一个匹配字符串 strCharSet 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str 中的字符,当被检验字符在字符串 strCharSet 中也包含时,则停止检验,并返回该字符位置。
示例
例1:

int main()
{
   const char str[] = "abcde2fghi3jk4l";
   const char strCharSet[] = "34";
   char *ret;

   ret = strpbrk(str, strCharSet);
   if(ret) 
   {
      printf("第一个匹配的字符是:%c\n", *ret);
   }
   else 
   {
      printf("未找到字符");
   }

   return(0);
}

输出结果
第一个匹配的字符是:3

例2:

int main( void )
{
   char str[100] = "The 3 men and 2 boys eat 5 pigs\n";
   char strCharSet[100] = "0123456789";
   char *result;

   printf( "1: %s\n", str );
   result = strpbrk( str, strCharSet );
   printf( "2: %s\n", result++ );
   result = strpbrk( result, strCharSet );
   printf( "3: %s\n", result++ );
   result = strpbrk( result, strCharSet );
   printf( "4: %s\n", result );
   return 0;
}

输出结果
1: The 3 men and 2 boys eat 5 pigs

2: 3 men and 2 boys eat 5 pigs

3: 2 boys eat 5 pigs

4: 5 pigs

自己实现strpbrk函数
函数的声明

char * my_strpbrk(const char *str,const char *strCharSet);

函数的定义和实现

char * my_strpbrk(const char *str,const char *strCharSet)
{
   const char *c = strCharSet;
   if (!*str)
      return (char *) NULL;
   while (*str != '\0')
   {
      for (c = strCharSet; *c != '\0'; c++)
      {
        if (*str == *c)
           break;
      }
      if (*c != '\0')
        break;
      str++;

   }
   if (*c == '\0')
      str = NULL;
   return (char *) str;
}

参考http://www.jb51.net/article/71441.htm
http://blog.csdn.net/a29562268/article/details/62444219
http://blog.chinaunix.net/uid-20480343-id-1941643.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值