Comparaison des tableaux de caractères et des littéraux de chaîne en C ++
-
08-07-2019 - |
Question
J'ai un tableau de caractères et j'essaie de déterminer s'il correspond à un littéral de chaîne, par exemple:
char value[] = "yes";
if(value == "yes") {
// code block
} else {
// code block
}
Cela a entraîné l'erreur suivante: la comparaison avec le littéral de chaîne entraîne un comportement non spécifié. J'ai aussi essayé quelque chose comme:
char value[] = "yes";
if(strcmp(value, "yes")) {
// code block
} else {
// code block
}
Cela n'a généré aucune erreur de compilation, mais il ne se comporte pas comme prévu.
La solution
std::strcmp
renvoie 0 si les chaînes sont égales.
Autres conseils
Consultez la documentation de strcmp. Astuce: il ne renvoie pas de valeur booléenne.
ETA: ==
ne fonctionne pas en général car cstr1 == cstr2
compare les pointeurs , de sorte que la comparaison ne sera vraie que si cstr1
et cstr2
pointent vers le même emplacement mémoire, même s’ils se trouvent dans les deux cas, ils font référence à des chaînes égales lexicographiquement. Ce que vous avez essayé (comparer une chaîne de chaîne à une lettre, par exemple cstr == "yes"
), en particulier ne fonctionnera pas, car la norme ne l'exige pas. Dans une implémentation raisonnable, je doute qu’elle explose, mais il est peu probable que cstr
aboutisse, car "yes"
ne renverra probablement pas l’adresse où réside la constante de chaîne <=>.
strcmp renvoie une valeur à trois états indiquant l’ordre relatif des deux chaînes. Lors d’un appel comme strcmp (a, b), la fonction retourne
- une valeur < 0 quand un & Lt; b
- 0 quand a == b
- une valeur > 0 quand un & Gt; b