📄 tool_str.c
字号:
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 + -