用flag的不同位记录不同的字符的出现状态,最笨的方法了属实是:
int Check_core_1(char* str, int * flag)
{
if(str[0]=='\0'&&((*flag)&(0x1<<1))&&(!((*flag)&(0x1<<5))))
return 1;
else if (str[0]=='\0')
return 0;
if(str[0]==' ')
return Check_core_1(str+1,flag);
if(str[0]=='+'||str[0]=='-') //符号位判断
{
if(!(*flag))
{
*flag = (*flag)|(0x1<<0);//最右边的一位表示是否有-+
return Check_core_1(str+1,flag);
}
else if(((*flag)&(0x1<<4)))
{
*flag=(*flag)&(~((0x1)<<4));
return Check_core_1(str+1,flag);
}
else
return 0;
}
*flag=(*flag)&(~((0x1)<<4));//倒数第五位给-的机会消除
if(str[0]>='0'&&str[0]<='9')
{
*flag = (*flag)&(~(0x1<<5));//E后面有数字
if(!((*flag)&(0x1)))
*flag = (*flag)|(0x1<<0);//-+
if(!((*flag)&(0x1<<1)))
*flag = (*flag)|(0x1<<1);//倒数第二位表示是否有数字
return Check_core_1(str+1,flag);
}
if(str[0]=='.')
{
if(!((*flag)&(0x1)))
*flag = (*flag)|(0x1<<0);//-+
if(!((*flag)&(0x1<<2))&&!((*flag)&(0x1<<3)))
{
*flag = (*flag)|(0x1<<2);//倒数第三位表示是否有小数点
return Check_core_1(str+1,flag);
}
else
return 0;
}
if(str[0]=='E'||str[0]=='e')
{
if(!((*flag)&(0x1)))
*flag = (*flag)|(0x1<<0);//-+
if(!((*flag)&(0x1<<3))&&((*flag)&(0x1<<1)))
{
*flag = (*flag)|(0x1<<3);//倒数第四位表示是否有e
*flag = (*flag)|(0x1<<4);//倒数第五位给-一次机会
*flag = (*flag)|(0x1<<5);//倒数第六位看e后面有无数字
return Check_core_1(str+1,flag);
}
else
return 0;
}
return 0;
}
int Check_1(char* str)
{
int i;
int len= strlen(str);
for(i=0;i<len;i++)
if(str[i]>'9'&&str[i]<'0'&&str[i]!='.'
&&str[i]!='+'&&str[i]!='-'&&str[i]!='E'
&&str[i]!='e'&&str[i]!=' ')
return 0;
return 1;
}
int isNumeric(char* str ) {
int finish = 0;
if(!Check_1(str))
return 0;
return Check_core_1(str,&finish);
}