UTF.COM.CN

分割GB2312中英文字符

作者:佚名 | 来源:网络 | 添加时间:2006-02-23 15:07:32 | 人气:2032

分割GB2312中英文字符

参考了论坛精华贴和strtok的实现 

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

/* 获取字符串首个中文或者英文的字节数 */
int GetCharSize( const char *Data, int Size ) 
{ 
    const unsigned char *= (unsigned char *) Data; 
    if ( p == NULL || Size <= 0 ) 
        return 0; 
    if ( p[0< 0xB0 || p[0> 0xF7 ) 
        return 1; 
    if ( Size < 2 ) 
        return -1; 
    if ( p[1< 0xA1 || p[1> 0xFE ) 
        return -1; 
    return 2; 
}

/* 判断是否有不合法字符 */
const char *FindInvalidChar( const char *Data, int Size )
{
    const char        *= Data;
    int        r, s = Size;
    
    while ( ( r = GetCharSize( p, s ) ) > 0 ) {
        p += r;
        s -= r;
    }
    
    if ( r == 0 )
        return NULL;
    return p;
}

/* 返回字符数目 */
int GetCharCount( const char *Data, int Size )
{
    const char        *= Data;
    int        r, c = 0, s = Size;
    
    while ( ( r = GetCharSize( p, s ) ) > 0 ) {
        c ++;
        p += r;
        s -= r;
    }
    
    if ( r == 0 )
        return c;
    return -1;
}


/* 得到每个字符 */
char *PickFirstChar( const char *pData, int pSize )
{
    static char zi[3];
    static const  char *sNew;/* 保存取出一个字符之后的字符串 */
    static int sSize;/* 保存调用完成后的长度 */
    int        i, r;
    char *temp = zi;
    
    memset(zi,’’,sizeof(zi));
    sNew  = pData ? pData : sNew;
    sSize  = pSize ? pSize : sSize;
    
    if ( ( r = GetCharSize( sNew, sSize ) ) <= 0 )
        return NULL;
    
    for ( i = 0; i < r; i ++ ) {
        zi = sNew;
    }
    
    sNew += r;
    sSize -= r;
    return zi;
}
int main()
{
    int num;
    int size;
    char *c;
    char str[] = "啊a国b人";
    const char *haha = str;
    
    size = strlen(haha);
    
    if (FindInvalidChar(haha, size) == NULL)
    {
        num = GetCharCount(haha, size);
        printf("%d
", num);
    }
    
    c = PickFirstChar(haha, size);
    while(c != NULL)
    {
        printf("%s
", c);
        c = PickFirstChar(NULL, 0);
    }
    return 0;
}

责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)

姓名:

验证码: 点击刷新