C++字符串内部查找函数

char* strchr( const char* str, int chr );
在str中查找第一次出现的chr,没找到则返回0

char* strrchr( const char* str, int chr );
在str中查找最后一次出现的chr,没找到则返回0

char* strstr( const char* str, const char* substr );
在str中查找第一次出现的substr,没找到则返回0

size_t strspn( const char* str, const char* chrset );
在str中查找 只包含在chrset中的字符 的最开始的最长字符数目
strspn( "cabbage", "abc" ) == 5;
strspn( "cabbage", "dc" ) == 1;
strspn( "cabbage", "d" ) == 0;
strspn( str, "abceg" ) == 7;

char* strspnp( const char* str, const char* chrset );
和strspn功能一样,只是返回指针
const char* str = "cabbage"
strspnp( str, "abc" ) == str+5;
strspnp( str, "dc" ) == str+1;
strspnp( str, "d" ) == str+0;
strspnp( str, "abceg" ) == 0; // 和strspn不一样

size_t strcspn( const char* str, const char* chrset );
在str中查找第一次出现在chrset中的字符位置,没找到则返回str结尾的'/0'的位置
strcspn( "xyzbxz", "abc" ) = 3
strcspn( "xyzbxz", "xyz" ) = 0
strcspn( "xyzbxz", "no match" ) = 6
strcspn( "xyzbxz", "" ) = 6
strcspn( "", "abc" ) = 0
strcspn( "", "" ) = 0

char* strpbrk( const char* str, const char* chrset );
和strcspn功能一样,只是返回指针
strpbrk( "xyzbxz", "abc" ) = "xyzbxz"+3
strpbrk( "xyzbxz", "xyz" ) = "xyzbxz"+0
strpbrk( "xyzbxz", "no match" ) = 0 // 和strcspn不一样
strpbrk( "xyzbxz", "" ) = 0 // 和strcspn不一样
strpbrk( "", "abc" ) = 0 // 和strcspn不一样
strpbrk( "", "" ) = 0 // 和strcspn不一样

------------------------

假如想将 "123@456@789" 分割成 "123" "456" "789" 当用 strchr
假如想将 "123@#456@#789" 分割成 "123" "456" "789" 当用 strstr
假如想将 "123@456#789@#0" 分割成 "123" "456" "789" "" "0" 当用 strcspn
假如想将 "123@456#789@#0" 分割成 "123" "456" "789" "0" 当用 strcspn/strspn

代码如下:(未曾测试过)
#include <stdio.h>
#include <string.h>
#include <assert.h>

void split001( const char* str, const char chr )
{
    const char* p1 = str;
    for( const char* p2; (p2=strchr(p1,chr))!=0; p1=p2+1 )
    {
        printf( "/"%.*s/"/n", p2-p1, p1 );
    }
    printf( "/"%s/"/n", p1 );
}
void split002( const char* str, const char* substr )
{
    assert( *substr );
    const size_t substrlen = strlen(substr);
    const char* p1 = str;
    for( const char* p2; (p2=strstr(p1,substr))!=0; p1=p2+substrlen )
    {
        printf( "/"%.*s/"/n", p2-p1, p1 );
    }
    printf( "/"%s/"/n", p1 );
}
void split003( const char* str, const char* substr )
{
    assert( *substr );
    const char* p1 = str;
    for( const char* p2; p2=p1+strcspn(p1,substr), *p2; p1=p2+1 )
    {
        printf( "/"%.*s/"/n", p2-p1, p1 );
    }
    printf( "/"%s/"/n", p1 );
}
void split004( const char* str, const char* substr )
{
    assert( *substr );
    const char* p1 = str;
    for( const char* p2; p2=p1+strcspn(p1,substr), *p2; p1=p2+strspn(p2,substr) )
    {
        printf( "/"%.*s/"/n", p2-p1, p1 );
    }
    printf( "/"%s/"/n", p1 );
}

int main( void )
{
    split001( "123@456@789", '@' );
    printf( "---/n" );
    split002( "123@#456@#789", "@#" );
    printf( "---/n" );
    split003( "123@456#789@#0", "@#" );
    printf( "---/n" );
    split004( "123@456#789@#0", "@#" );
    printf( "---/n" );

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值