⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tool_str.c

📁 sco unix下c语言开发工具库
💻 C
📖 第 1 页 / 共 3 页
字号:
        item_len = p - &str[*pos];
        item = malloc( item_len + 1 );
        memset( item, 0, item_len + 1 );
        memcpy( item, &str[ * pos ], item_len );

        * pos = * pos + item_len + strlen( delimit );
    }
    else if ( strlen( &str[*pos] ) > 0 )
    {   
        item_len = strlen( &str[*pos] );
        item = malloc( item_len + 1 );
        memset( item, 0, item_len + 1 );
        memcpy( item, &str[ * pos ], item_len ); 
        * pos = * pos + item_len;
    }    
    else
        return ( NULL );

    return ( item );
}

/*
 * 数字
 */
int StrIsNumeric( char * str, int len )
{
    int  i;

    for ( i = 0; i < len; i++ )
        if ( !isdigit( str[i] ) )
            return ( 0 );

    return ( 1 );
}

/*
 * 浮点数字( 允许负号 )
 * 开头不能连续两个 '0'
 * 除第一个位置外不能为 '-'
 * 不能有两个小数点
 */
int StrIsFloat( char * str, int len )
{
    int  i, f_zero = 0, f_dot = 0;

    if ( len > 1 && str[0] == '0' && str[1] == '0' )
        return ( 0 );

    for ( i = 0; i < len; i++ )
    {
        if ( str[i] == '-' && i > 0 )
            return ( 0 );
        else if ( str[i] == '.' )
        {
            if ( f_dot )
                return ( 0 );
            else
                f_dot = 1;
        }
        else if ( !isdigit( str[i] ) )
            return ( 0 );
    }
    return ( 1 );
}

/*
 * 金额数字( 正浮点数 )
 * 不能有两个小数点
 */
int StrIsMoney( char * str, int len )
{
    int  i, f_zero = 0, f_dot = 0;

    for ( i = 0; i < len; i++ )
    {
        if ( str[i] == '.' )
        {
            if ( f_dot )
                return ( 0 );
            else
                f_dot = 1;
        }
        else if ( !isdigit( str[i] ) )
            return ( 0 );
    }
    return ( 1 );
}

/*
 * Ascii可见字符
 */
int StrIsGraph( char * str, int len )
{
    int  i;
    for ( i = 0; i < len; i++ )
        if ( !isgraph( str[i] ) )
            return ( 0 );
    return ( 1 );
}

/*
 * 字母
 */
int StrIsAlpha( char * str, int len )
{
    int  i;
    for ( i = 0; i < len; i++ )
        if ( !isalpha( str[i] ) )
            return ( 0 );
    return ( 1 );
}

/*
 * 字母数字
 */
int StrIsAlnum( char * str, int len )
{
    int  i;
    for ( i = 0; i < len; i++ )
        if ( !isalnum( str[i] ) )
            return ( 0 );
    return ( 1 );
}

/*
 * 中文
 */
int StrIsChinese( char * str, int len )
{
    int  i;
    if ( len % 2 )
        return ( 0 );
    for ( i = 0; i < len; i+=2 )
        if ( !ischn_2b( ( unsigned char ) str[i], ( unsigned char ) str[i+1] ) )
            return ( 0 );
    return ( 1 );
}

/*
 * 符号数字
 * 0-9, -, +, .
 */
int StrIsSymNumeric( char * str, int len )
{
    int  i;
    for ( i = 0; i < len; i++ )
        if ( !isdigit( str[i] ) && str[i] != '-' && str[i] != '+' &&
             str[i] != '.' )
            return ( 0 );
    return ( 1 );
}

int StringIsValidType( int type, char * str, int offset, int count )
{
    int     i;

    switch ( type )
    {
        case 1 : /* 数字 */
            return ( StrIsNumeric( str + offset, count ) );
            break;
        case 2 : /* 浮点数字 */
            return ( StrIsFloat( str, strlen( str ) ) );
            break;
        case 3 : /* 金额数字 */
            return ( StrIsMoney( str, strlen( str ) ) );
            break;
        case 4 : /* 字母 */
            return ( StrIsAlpha( str + offset, count ) );
            break;
        case 5 : /* 字母数字 */
            return ( StrIsAlnum( str + offset, count ) );
            break;
        case 6 : /* 可见字符 */
            return ( StrIsGraph( str + offset, count ) );
            break;
        case 7 : /* 中文 */
            return ( StrIsChinese( str + offset, count ) );
            break;
        case 8 : /* 符号数字(0-9,-,+,.) */
            return ( StrIsSymNumeric( str + offset, count ) );
            break;
        default :
            break;
    }
    return ( 1 );
}

static char valid_type_str[9][9] = {
                "任意字符", "数字",     "浮点数字",   "金额数字",
                "字母",     "字母数字", "可见字符",   "中文", "符号数字" };
char * ValidTypeString( int type )
{
    if ( type <= 0 || type > 7 )
        return ( valid_type_str[0] );
    else
        return ( valid_type_str[type] );
}

int IsNumericType( int type )
{
    if ( type == 1 || type == 2 || type == 3 || type == 8 )
        return ( 1 );
    return ( 0 );
}

/*
 * 整形按格式转换为字符串
 * 输入:格式
 *       整数
 * 返回:整数串
 */
static char itos_buf[ 50 ];
char * itos( char * fmt, int value )
{
    sprintf( itos_buf, fmt, value );

    return ( itos_buf );
}

/*
 * 取字符串的前缀部分
 * 如 : " 1 - 中国", 前缀部分为"1"
 */
char * StringGetPrefix( char * str )
{
    int len;
    char * p, * p1, * p2;

    if ( str == NULL )
        return ( NULL );

    p1 = str;
    while ( *p1 == ' ' && *p1 != 0x0 )
        p1++;

    p2 = p1;
    while ( *p2 != ' ' && *p2 != '-' && *p2 != 0x0 )
        p2++;

    if ( ( len = p2 - p1 ) == 0 )
        return ( NULL );

    p = malloc( len + 1 );
    strncpy( p, p1, len );
    p[len] = 0x0;

    return ( p );
}

/*
 * 取字符串的提示部分
 * 如 : " 1 - 中国", 提示部分为"中国"
 */
char * StringGetPrompt( char * str )
{
    int len;
    char * p, * p1, * p2;

    if ( str == NULL )
        return ( NULL );

    /*
     * 跳过前缀
     */
    p1 = str;
    while ( *p1 == ' ' && *p1 != 0x0 )
        p1++;
    p2 = p1;
    while ( *p2 != ' ' && *p2 != '-' && *p2 != 0x0 )
        p2++;

    /*
     * 无前缀, 则回到起点
     */
    if ( *p2 == 0x0 )
        p2 = str;

    /*
     * 跳过分隔
     */
    while ( ( *p2 == ' ' || *p2 == '-' ) && *p2 != 0x0 )
        p2++;

    if ( ( len = strlen( p2 ) ) == 0 )
        return ( NULL );

    p = malloc( len + 1 );
    strcpy( p, p2 );

    return ( p );
}

/* 
 * 按分隔符过滤串取其中的项 
 * 输入: 源串
 *        分隔符
 *        当前位置
 * 输出: 
 * 返回:
 *        NULL - 没有项数
 *        指针 - 指向项目内容区
 */
char * StrItemCutByDelimit( char * str, char * delimit, int * pos )
{
    int              i;
    unsigned char  * p1, *p2;
    char           * item;
    int              item_len;
    int              dlmt_len;

    if ( str == NULL || delimit == NULL )
        return ( NULL );

    if ( * pos == strlen( str ) )
        return ( NULL );

    p1 = ( unsigned char * ) &str[ * pos ];
    p2 = p1;

    dlmt_len = strlen( delimit );

    while ( * p1 )
    {
        for ( i = 0; i < dlmt_len; i ++ )
            if ( delimit[ i ] == ( * p1 ) )
                 break;

        if ( i >= dlmt_len )
        {
            p2 = p1;
            while( * p1 )
            {
                for ( i = 0; i < dlmt_len; i++ )
                    if ( delimit[ i ] == ( * p1 ) )
                        break;

                if ( i < dlmt_len )
                {
                    item = malloc( p1 - p2 + 1 );
                    memcpy( item, p2, p1 - p2 );
                    item[ p1 - p2 ] = 0;
                    (* pos) += ( (char*) p1 - &str[*pos] );
                    return ( item );
                }
                p1 ++;
            }

            if ( p1 - p2 > 0 )
            { 
                item = malloc( p1 - p2 + 1 );
                memcpy( item, p2, p1 - p2 );
                item[ p1 - p2 ] = 0;
                (* pos) += ( (char*) p1 - &str[*pos] );
                return( item );
            }
        }
        p1 ++;
    }

    if ( p1 - p2 > 0 )
    { 
        item = malloc( p1 - p2 + 1 );
        memcpy( item, p2, p1 - p2 );
        item[ p1 - p2 ] = 0;
        (* pos) += ( (char*) p1 - &str[*pos] );
        return( item );
    }

    return ( NULL );
}

int ustrlen( const unsigned char * str )
{
    return ( strlen( ( char * ) str ) );
}

/*
 * 去除定长串中的填充符
 */
int StrCutFillChar( char * str, char * fillchar, int justmod )
{
    int    i;
    int    j;
    int    fil_len;
    int    dat_len;
    char   * tmps;

    if ( str == NULL || fillchar == NULL )
        return ( 0 );

    fil_len = strlen( fillchar );
    dat_len = strlen( str );
     
    if ( fil_len == 0 || dat_len == 0 )
        return ( 0 );

    /* 右对齐 */
    if ( justmod == 1 )
    {
        j = 0;
        while ( j < dat_len )
        {
            for ( i = 0; i < fil_len; i++ )
                if ( str[ j + i ] != fillchar[ i ] )
                     break;

            if ( i >= fil_len )
                j += fil_len;
            else
                break;
        }

        if ( dat_len - j > 0 )
        {
             tmps = malloc( dat_len - j + 1 );
             strcpy( tmps, &str[ j ] );
             tmps[ dat_len - j ] = 0;
             strcpy( str, tmps );
             free( tmps );
        }
        else
             str[ 0 ] = 0;
    }
    else if ( justmod == 0 ) /* 左对齐 */
    {
        while ( dat_len > 0 )
        {
            for ( i = 0; i < fil_len; i++ )
                if ( str[ dat_len - i - 1 ] != fillchar[ fil_len - i - 1 ] )
                     break;

            if ( i >= fil_len )
                dat_len -= fil_len; 
            else
                break;
        }

        if ( dat_len <= 0 )
            dat_len = 0;

        str[ dat_len ] = 0;
    }

    return ( 0 );
}

/*
 * 如果 str 以0x开头, 认为是十六进制数
 */
int HexToUch( char * str, unsigned char * ustr, int max_len )
{
    int   i, j, len;
    char  s[3];

    if ( max_len <= 0 )
        return ( 0 );

    memset( ustr, 0x0, max_len );
    len = strlen( str );
    if ( len > 2 && str[0] == '0' && toupper( str[1] ) == 'X' )
    {
        i = 0;
        while ( 2*i + 2 < len && i < max_len )
        {
            sscanf( str + 2 + 2*i, "%2x", &j );
            ustr[i] = j;
            i ++;
        }
    }
    else
    {
        i = Min( max_len, len );
        memcpy( ustr, str, i );
    }
    return ( i );
}

/*
 * 如果 ustr 中有非可见字符, 转换为十六进制数
 */
int UchToHex( char * str, unsigned char * ustr, int max_len )
{
    int   i, f_graph = 1;

    if ( max_len <= 0 )
        return ( 0 );

    for ( i = 0; i < max_len; i++ )
    {
        if ( ustr[i] == 0x0 )
            break;
        if ( ustr[i] <= 0x20 || ustr[i] >= 0x7F )
            f_graph = 0;
    }
    max_len = i;

    if ( f_graph )
    {
        memcpy( str, ustr, max_len );
        str[ max_len ] = 0x0;
    }
    else
    {
        strcpy( str, "0x" );
        for ( i = 0; i < max_len; i++ )
            sprintf( str + 2 + 2 * i, "%x", ustr[i] );
    }
    return ( 0 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -