est-ce un bon moyen de faire un strcmp pour retourner false lorsque les chaînes sont vides

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

  •  05-07-2019
  •  | 
  •  

Question

Je veux une autre condition - toujours maintenir un temps d'exécution rapide, mais safer , où je renvoie false si l'une des chaînes ou les deux sont vides:

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

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

     return strcmp(str1,str2);

}
Était-ce utile?

La solution

Non, ce n'est pas un bon moyen de le faire, car cela ne fonctionne pas.

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

sera évalué comme:

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

En d’autres termes, comme le booléen sera promu en entier, votre test retournera vrai chaque fois que les chaînes commencent par des caractères différents ( tmp1 sera faux, ce qui sera converti en 0, et ainsi de suite. tmp2 devient vrai)

N'essayez pas de déjouer le compilateur. Écrire du code rapide ne consiste pas à écrire le moins de lignes de code possible, ni même de lignes aussi courtes que possible. Même si chaîner == de cette manière était significatif, il n'y a aucune raison pour que ce soit plus rapide. Écrivez simplement un code que vous comprenez et pouvez écrire correctement.

Autres conseils

Même si vous implémentez les tests préliminaires que vous suggérez correctement, il est très improbable que vous accélériez les choses en procédant de la sorte - strcmp le fera déjà ou presque.

Voici le code pour 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;
}

C'est déjà aussi rapide que possible. Votre chèque en surnombre ne fait que ralentir les cas qui ne vous intéressent pas.

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

L'exemple que vous avez donné ne fonctionnera même pas correctement. strcmp () s'arrête aux premiers caractères différents. Si les deux chaînes sont vides, vous serez satisfait par votre " cas particulier " ci-dessus, cela sera traité aussi rapidement que l'exemple que vous avez donné.

En ajoutant un gestionnaire spécial pour les deux chaînes vides comme ci-dessus, vous avez uniquement créé les cas où elles ne le sont pas, de manière correspondante plus lente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top