[C con Clase] Expresiones Regulares en C
Programante
programante en gmail.com
Sab Dic 19 16:26:31 CET 2009
Kalith escribió:
> aqui la version corregida en ansi C
>
> int scanner(char* word){
>
> unsigned int i = 0, aux = 0, pos, dot = 0;
>
> for (;i < strlen(word); ++i){
>
> if(!dot && !aux && i > 0 && word[i] == '@') ++aux, pos = i;
>
> if(!dot && aux && word[i] == '.' && (i - pos > 1)) ++aux, dot = 1;
>
> if(dot && (strlen(word) - i > 2)) return 1;
> }
>
> return 0;
> }
>
> y mi version en c++ mas corta que hace lo mismo testie todos los
> posibles casos y creo que esta bastante bien..
>
> bool scanner(string word){
>
> bool ret = false;
>
> size_t pa = word.find('@'), pd = word.find('.');
>
> if(pa != string::npos && pd != string::npos){
>
> if(pa > 0 && (pd - pa > 1) && (word.size() - pd > 2))
> ret = true;
> }
>
> return ret;
> }
No son iguales.
La segunda acepta "foo.bar en com"; y la primera no.
Lo arreglas cambiando la línea a
size_t pa = word.find('@'), pd = word.find('.', pa);
Por otro lado, las llamadas a strlen en la primera versión le dan un
rendimiento cuadrático.
Cambia i < strlen(word) a word[i] en la guarda del bucle.
Puedes mejorar un poco la condición if(strlen(word) - i > 2)
escribiéndola como if(strlen(word + i) > 2)
pero en realidad no necesitas usar la variable dot, ya que lo que haces
es mirar la longitud nada más encontrar el punto.
Te quedaría:
int scanner3(char* word){
unsigned int i, aux = 0, pos;
for (i=0; word[i]; ++i){
if (!aux && i > 0 && word[i] == '@') ++aux, pos = i;
if(aux && word[i] == '.' && (i - pos > 1)) {
++aux;
if(strlen(word+i) > 2)
return 1;
else
return 0;
}
}
return 0;
}
Más información sobre la lista de distribución Cconclase