è un buon modo per fare uno strcmp per restituire false quando le stringhe sono vuote

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

  •  05-07-2019
  •  | 
  •  

Domanda

Voglio un'altra condizione: mantenere un tempo di esecuzione veloce ma più sicuro - dove restituisco false se una o entrambe le stringhe sono vuote:

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

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

     return strcmp(str1,str2);

}
È stato utile?

Soluzione

No, non è un buon modo per farlo, perché non funziona.

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

verrà valutato come:

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

In altre parole, poiché il bool verrà promosso a un numero intero, il test tornerà vero ogni volta che le stringhe iniziano con caratteri diversi ( tmp1 sarà falso, che verrà convertito in 0, e così tmp2 diventa vero)

Non tentare di superare in astuzia il compilatore. Scrivere codice veloce non significa scrivere il minor numero di righe di codice possibile, o anche il più breve numero di righe possibile. Anche se concatenare == in questo modo era significativo, non c'è motivo per cui sarebbe più veloce. Scrivi semplicemente il codice che capisci e puoi scrivere correttamente.

Altri suggerimenti

Anche se si implementano i test iniziali suggeriti correttamente, è molto improbabile che tu faccia le cose più velocemente facendo questo tipo di cose - strcmp lo farà già o quasi.

Ecco il codice per 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;
}

È già veloce come potrebbe essere significativamente. Il tuo controllo estraneo rende solo i casi che non ti interessano più lenti.

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

L'esempio che hai fornito non funzionerà nemmeno correttamente. strcmp () si fermerà ai primi caratteri diversi. Se entrambe le stringhe sono vuote, come soddisfatto dal tuo "caso speciale" sopra, questo verrà gestito altrettanto rapidamente come nell'esempio che hai fornito.

Aggiungendo un gestore speciale per entrambe le stringhe vuote come sopra, hai reso i casi in cui non lo sono, di conseguenza più lenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top