C++ 代码:复制
#include <stdio.h> #include <string.h> /* 获取字符串首个中文或者英文的字节数 */ int GetCharSize( const char *Data, int Size ) { const unsigned char *p = (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 *p = 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 *p = 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; }