Comment comparer correctement les cordes ?
char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow
// insufficient
while (check != input)
// good
while (strcmp(check, input) != 0)
// or
while (strcmp(check, input))
Creusons un peu plus pour voir pourquoi check != input
n'est pas suffisant .
En C, chaîne de caractères est une spécification de la bibliothèque standard.
A chaîne de caractères est une séquence contiguë de caractères terminée par et incluant le premier caractère nul.
C11 §7.1.1 1
input
ci-dessus n'est pas un chaîne de caractères . input
es tableau 40 de caractères .
Le contenu de input
peut devenir un chaîne de caractères .
Dans la plupart des cas, lorsqu'un tableau est utilisé dans une expression, il est converti à l'adresse de son 1er élément.
Le tableau ci-dessous convertit check
y input
à leurs adresses respectives du premier élément, puis ces adresses sont comparées.
check != input // Compare addresses, not the contents of what addresses reference
Pour comparer chaînes de caractères nous devons utiliser ces adresses et examiner les données vers lesquelles elles pointent.
strcmp()
fait le travail . §7.23.4.2
int strcmp(const char *s1, const char *s2);
El strcmp
compare la chaîne de caractères pointée par s1
à la chaîne de caractères pointée par s2
.
El strcmp
renvoie un nombre entier supérieur, égal ou inférieur à zéro, de même que la chaîne de caractères pointée par s1
est supérieure, égale ou inférieure à la chaîne de caractères pointée par s2
.
Le code peut non seulement déterminer si les chaînes de caractères sont de la même donnée, mais aussi laquelle est la plus grande ou la plus petite lorsqu'elles diffèrent.
Ce qui suit est vrai lorsque les chaînes de caractères sont différentes.
strcmp(check, input) != 0
Pour en savoir plus, voir Créer mon propre strcmp()
fonction
17 votes
gets( )
a été supprimé de la norme. Utilisezfgets( )
à la place.1 votes
Notez que cette respuesta à Pourquoi est-ce que
strcmp()
retourne zéro lorsque ses entrées sont égales explique comment comparer des chaînes de caractères pour l'égalité, l'inégalité, moins que, plus que, moins que ou égal, et plus que ou égal. Les comparaisons de chaînes de caractères ne sont pas toutes des comparaisons d'égalité. Les comparaisons sensibles à la casse sont encore différentes ; d'autres comparaisons spéciales (ordre du dictionnaire, par exemple) nécessitent des comparateurs plus spécialisés, et il existe des regex pour des comparaisons encore plus complexes.0 votes
Notez également qu'il y a une question essentiellement dupliquée Comment vérifier si une valeur correspond à une chaîne de caractères ? qui a été posée des années auparavant.
0 votes
Cela répond-il à votre question ? Comment vérifier si une valeur correspond à une chaîne de caractères ?
3 votes
Cette question est bonne, mais l'utilisation de
gets()
est un échec. Elle a également été supprimée de la norme depuis la C11 -> A lire Pourquoi la fonction gets est-elle si dangereuse qu'elle ne doit pas être utilisée ?