¿Es esta una buena manera de hacer un strcmp para devolver falso cuando las cadenas están vacías

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

Pregunta

Quiero otra condición: seguir manteniendo un tiempo de ejecución rápido pero más seguro - donde devuelvo falso si una o ambas cadenas están vacías:

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
¿Fue útil?

Solución

No, no es una buena manera de hacerlo, porque no funciona.

if(*str1==*str2 =='\0')

se evaluará como:

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

En otras palabras, dado que el bool se convertirá en un entero, su prueba devolverá verdadero cada vez que las cadenas comiencen con caracteres diferentes ( tmp1 será falso, que se convierte a 0, y así tmp2 se convierte en verdadero)

No trates de ser más astuto que el compilador. Escribir código rápido no se trata de escribir tan pocas líneas de código como sea posible, o incluso líneas tan cortas como sea posible. Incluso si encadenar == de esta manera fue significativo, no hay razón para que sea más rápido. Simplemente escriba el código que entienda, y puede escribir correctamente.

Otros consejos

Incluso si implementas las primeras pruebas que sugieres correctamente, es muy poco probable que hagas las cosas más rápido haciendo este tipo de cosas: strcmp ya estará haciendo esto o casi esto.

Aquí está el código para strcmp () :

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

Ya es tan rápido como podría ser de manera significativa. Su cheque extraño solo hace que los casos que no le interesan sean más lentos.

if( *str1 == 0 || *str2 == 0 )
   return 0;

El ejemplo que has dado ni siquiera se ejecutará correctamente. strcmp () se detendrá en los primeros caracteres diferentes. Si ambas cadenas están vacías, como lo satisface su " caso especial " anteriormente, esto se manejará tan rápido como el ejemplo que has dado.

Al agregar un controlador especial para las dos cadenas vacías como se indicó anteriormente, solo ha logrado que los casos no lo estén, lo que es más lento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top