bool isnumber(char a)
{
int value=a-'0';
if(value>=0&&value<=9)
return true;
else
return false;
}
bool isinterger(char *s)//判斷是否為帶符号整數
{//小數點左邊部分不能為空
//第一位可以為符号
//除符号外必須有數字
int i=0;
int len=strlen(s);
int flag=0;
if(len==0)
return false;
if(s[0]=='+'||s[0]=='-')
flag=1;
if(flag==1&&len==1)
return false;
if(flag!=1&&!isnumber(s[0]))
return false;
for(i=1;i<len;i++)
{
if(!isnumber(s[i]))
return false;
}
return true;
}
bool isuninterger(char *s)//判斷是否是無符号整數
{
int i=0;
int len=strlen(s);
if(len==0)
return true;
for(i=0;i<len;i++)
{
if(!isnumber(s[i]))
return false;
}
return true;
}
int isfirst(char*s,char a)
{
int i=0;
int len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]==a)
return i;
}
return -1;
}
bool isfloat(char *s)
{
int index=0;
int len=strlen(s);
char *left=(char*)malloc(sizeof(char)*10000);
char *right=(char*)malloc(sizeof(char)*10000);
int flag1=0;
int flag2=0;
if(!strchr(s,'.'))
return false;
index=isfirst(s,'.');//擷取到.的位置
printf("index=%d ",index);
if(index!=0)
{
strncpy(left, s, index);
left[index]='\0';
}
else
flag1=1;
if(index!=len-1)
{
strncpy(right, s+(index+1),len-(index+1));
right[len-(index+1)]='\0';
}
else
{
printf("****");
flag2=1;
}
if(flag1==1&&flag2==1)
return false;
if((strlen(left)==1&&(left[0]=='+'||left[0]=='-'))&&flag2==1)
return false;
printf("flag1==1 %d\n",flag1==1);
printf("isinterger(left)%d\n",isinterger(left));
printf("flag2==1%d\n",flag2==1);
printf("isuninterger(right)%d\n",isuninterger(right));
printf("%s\n",right);
if((strlen(left)==1)&&(left[0]=='+'||left[0]=='-')&&isuninterger(right))
return true;
if((flag1==1||isinterger(left))&&(flag2==1||isuninterger(right)))
{
printf("right\n");
return true;
}
return false;
}
bool contain_e(char*s)
{
int index=0;
char *left=(char*)malloc(sizeof(char)*10000);
char *right=(char*)malloc(sizeof(char)*10000);
int len=strlen(s);
if(!strchr(s,'e'))//不包含e
return false;
index=isfirst(s,'e');//擷取到e的位置
if(index==0||index==len-1)//e不能出現在開頭或者結尾
return false;
strncpy(left, s, index);
left[index]='\0';
strncpy(right, s+(index+1),len-(index+1));
right[len-(index+1)]='\0';
if((isinterger(left)||isfloat(left))&&isinterger(right))
{
printf("right\n");
return true;
}
return false;
}
char* removekongge(char *s)
{
char* answer=(char*)malloc(sizeof(char)*10000);
int len=strlen(s);
int i=0,j=0;
int index1=0;
int index2=0;
for(i=0;i<len;i++)
if(s[i]!=' ')
{
index1=i;
break;
}
for(i=len-1;i>=0;i--)
{
if(s[i]!=' ')
{
index2=i;
break;
}
}
strncpy(answer, s+index1, index2-index1+1);
answer[index2-index1+1]='\0';
return answer;
}
bool isNumber(char * s)
{
//計算字元串s的(unsigned int型)長度,不包括'\0'在内
int len=strlen(s);
if(len==0)//空字元串
return false;
s=removekongge(s);
printf("\"%s\"",s);
int i=0 ;
len=strlen(s);//計算字元串長度
if(len==1&&!isnumber(s[0]))//如果字元串有一位的話隻能是數字
return false;
// if(!(s[0]=='+'||s[0]=='-'||((s[0]-'0')>=0&&(s[0]-'0')<=9)))//第一位隻能是符号或者數字
// return false;
//C标準庫中的strchr函數傳回字元c在字元串s的位置
//C語言有atoi、atol、atof等庫函數,可分别把ASCII編碼的字元串轉化為int、long、float類型的數字
//char *strncpy(char *dest, const char *src, int n),表示把src所指向的字元串中以src位址
//開始的前n個位元組複制到dest所指的數組中,并傳回被複制後的dest。
if(contain_e(s))//如果該數字包含e
return true;
else if(isfloat(s))//如果該數字包含.
return true;
else if(isinterger(s))//純整數
return true;
return false;
}