• 字符串内部查找函数


    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;
    }

  • 相关阅读:
    漫谈grpc 3:从实践到原理,带你参透 gRPC
    有关CPU合并写的一个java小实验
    瞎几*把idea中的快捷键,整乱了,恢复默认快捷键
    python创建mysql数据库中文编码问题
    python2.x print打印不换行
    解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
    uniGUI学习之Cookie(54)
    博客园自定义标题背景颜色条【自用】
    亲测解决 github 访问慢的问题
    转: JVM规范系列第1章:引言
  • 原文地址:https://www.cnblogs.com/shengshuai/p/1410089.html
Copyright © 2020-2023  润新知