В своё время не придал значению тому, что пустая строка ("") воспринимается как допустимое значение (подразумевая 0). При тестировании функции (точнее её реализации на Blitz3D) в полевых условиях с применением "эффекта кота" обнаружились (ВНЕЗАПНО?) дополнительные допустимые конструкции, которые уже с натяжкой можно списать на интеллектуальность парсера "строка->число". Исправляется всё просто.
Для проверки используется набор значений impersonalis-F1(
FAIL-1):
Функция:
bool Check(char *s,int LEN){
enum SymbolIs{DIGIT,EXP,SEP,SIGN,ETC};
SymbolIs Key;
int i;
int Epos=-1;
int Spos=-1;
bool ExitFlg=true;
bool IsClose=false;
for(i=0;i<LEN && ExitFlg;i++){
if(s[i]>='0' && s[i]<='9'){
Key=DIGIT;
}
else if(s[i]=='E' || s[i]=='e'){
Key=EXP;
}
else if(s[i]=='.' || s[i]==','){
Key=SEP;
}
else if(s[i]=='+' || s[i]=='-'){
Key=SIGN;
}
else{
Key=ETC;
}
IsClose=false;
switch(Key){
case DIGIT:{
IsClose=true;
break;
}
case EXP:{
if(Epos!=-1){
ExitFlg=false;
break;
}
Epos=i;
break;
}
case SEP:{
if(Spos!=-1){
ExitFlg=false;
break;
}
Spos=i;
break;
}
case SIGN:{
if(i==0 || Epos==i-1){
break;
}
ExitFlg=false;
break;
}
case ETC:{
ExitFlg=false;
break;
}
}
}
if(!IsClose){
ExitFlg=false;
}
return ExitFlg;
}
Если закомментить строку сброса ExitFlg при лжи в IsClose функция вновь не проходит новый тест.
Test "SBJoker"
ололо 0
15445.1 1
Test "impersonalis"
12БЛДЖАД! 0
Test "Phantom"
123.345E-12 1
Test "zombiee"
23.2gh465E-1 0
23.2465E-1 1
sdgf23.2465E-1 0
Test "impersonalis-2"
1+1 0
+.12E-008 1
+.12E-008.1 0
Test "impersonalis-F1"
E 0
0
+ 0
- 0
. 0
Присылайте ваши наборы с аргументацией некорректности работы функции!