Quelle est la meilleure façon de comparer deux chaînes pour l’égalité en C?

J’ai deux chaînes (littéraux de chaîne dans ce cas), disons

char *name = "Fotis"; char *second_name = "Fotis"; 

et j’ai deux façons de les comparer, ce qui me donne un résultat précis. Le premier est avec l’opérateur d’égalité ( == ), de même:

 if (name == second_name) printf ("Great success!\n"); 

et le second via la fonction strcmp disponible dans ssortingng.h :

 if (strcmp (name, second_name) == 0) printf ("Great success!\n"); 

Ma question est la suivante: lequel des deux est le plus efficace? idiomatique} moyen de comparer deux chaînes en C? Y a-t-il un autre moyen, plus idiomatique?

La deuxième méthode avec strcmp est correcte, la première méthode avec == est incorrecte car elle compare uniquement la valeur des pointeurs, pas le contenu des chaînes.

Les deux chaînes que vous comparez sont à la fois des littéraux de chaîne, elles peuvent et peuvent ne pas avoir la même valeur de pointeur par rapport à la norme.

La manière naturelle serait d’utiliser strcmp car c’est plus précis.

Votre première méthode utilisant == compare les pointeurs. Elle ne renvoie donc true que si les deux sont exactement le même tableau de caractères, ce qui signifie qu’ils pointent vers le même fragment de mémoire. L’autre méthode utilisant strcmp est la méthode que vous utiliseriez, car elle compare le contenu réel des chaînes. Donc, il peut retourner vrai même si les deux chaînes sont dans des emplacements différents en mémoire.

La raison pour laquelle votre première méthode semble fonctionner correctement est que les deux variables pointent vers le même littéral de chaîne. Elles désignent donc le même emplacement en mémoire lorsqu’elles sont identiques, et des emplacements différents lorsqu’elles diffèrent. . Si vous malloc pour allouer de la mémoire à ces chaînes et définir leur contenu, elles pointeraient vers différents emplacements en mémoire, de sorte que votre première méthode renverrait false et la seconde renverrait true pour la même chaîne de texte.

 if (name == second_name) printf ("Great success!\n"); 

Faites attention: vous comparez l’égalité des pointeurs avec celle-ci, pas avec les textes des chaînes.