Pourquoi strcmp () retourne 0 quand ses entrées sont égales?
Quand je fais un appel à la chaîne C de comparer la fonction comme ceci:
strcmp("time","time")
Elle renvoie la valeur 0, ce qui implique que les chaînes ne sont pas égales.
Quelqu'un peut me dire pourquoi des implémentations C semblent faire cela? Je pense qu'il doit retourner une valeur non nulle en cas d'égalité. Je suis curieux de savoir les raisons pour lesquelles je suis de voir ce comportement.
source d'informationauteur Xenu
Vous devez vous connecter pour publier un commentaire.
strcmp renvoie une différence lexicale (ou devrais-je l'appeler "court-circuit série d'octets de référence" ? 🙂 ) des deux chaînes que vous avez donné en tant que paramètres.
0 signifie que les deux chaînes sont égales
Une valeur positive signifie que s1 serait après s2 dans un dictionnaire.
Une valeur négative signifie que s1 avant de s2 dans un dictionnaire.
Donc votre valeur non nulle lorsque l'on compare les "temps" et "l'argent" qui sont évidemment différents, même si on pourrait dire que le temps c'est de l'argent ! 🙂
La bonne chose à propos d'une œuvre de ce genre est que vous pouvez dire
Notez comment la comparaison avec 0 correspond à la comparaison de l'implication.
Il est commun pour les fonctions de retour à zéro pour la commune ou de l'un-de-un-genre - cas et non nulle pour des cas particuliers. Prendre la fonction principale, qui classiquement renvoie zéro en cas de succès et certains valeur non nulle en cas d'échec. Les précis de la non-valeur de zéro indique ce qui s'est passé. Par exemple: de mémoire, pas de droits d'accès ou quelque chose d'autre.
Dans votre cas, si la chaîne est égale, alors il n'y a pas de raison pourquoi il est égal que les chaînes contiennent les mêmes caractères. Mais si elles sont non-égalité alors, soit la première peut être plus petit, ou la seconde peut être plus petit. L'avoir de retour de 1 pour l'égalité, 0 pour les petites et 2 pour une plus grande serait quelque peu étrange, je pense.
Vous pouvez également penser en termes de la soustraction:
Si s1 est "lexicographiquement" moins, il donnera une valeur négative.
Une autre raison
strcmp()
renvoie les codes, il n'est de sorte qu'il peut être utilisé directement dans la bibliothèque standard de la fonctionqsort()
vous permettant de trier un tableau de chaînes de caractères:Ce petit exemple de programme trie ses arguments ASCIIbetically (ce que certains appellent lexicalement). Lookie:
Si
strcmp()
retourné1
(true) pour l'égalité des chaînes de caractères et0
(false) pour inégalitaires, il serait impossible de l'utiliser pour obtenir le degré ou direction de l'inégalité (c'est à dire la façon dont différents, et qui est le plus grand) entre les deux chaînes, de sorte qu'il est impossible de l'utiliser comme une fonction de tri.Je ne sais pas comment vous vous serez familiarisé avec C. Le code ci-dessus utilise une partie de C les plus confondre des concepts - l'arithmétique des pointeurs, le pointeur de la refonte, et des pointeurs de fonction, donc si vous ne comprenez pas certains de ce code, ne vous inquiétez pas, vous allez y arriver dans le temps. D'ici là, vous aurez beaucoup de plaisir de questions à poser sur StackOverflow. 😉
Vous semblez vouloir
strcmp
à travailler comme un (hypothétique)Pour être sûr que ce serait vrai pour le "zéro est faux" interprétation des résultats en entiers, mais il ne ferait que compliquer la logique de tri, parce que, ayant établi que les deux chaînes n'étaient pas les mêmes, vous auriez encore besoin d'apprendre qui est venu "plus tôt".
De plus, je soupçonne que d'une mise en œuvre commune ressemble à
qui est [edit: un peu] élégant dans un K&R sorte de façon. Le point important ici (qui est de plus en plus obscurcie par le code de la droite (évidemment je devrais avoir laissé assez bien seul)) est le moyen de l'instruction de retour:
qui donne les résultats de la comparaison naturellement en termes de valeurs de caractère.
Il y a trois résultats possibles: chaîne de caractères 1 vient avant chaîne 2 chaîne 1 vient après la chaîne 2 chaîne 1 est la même que la chaîne 2. Il est important de garder ces trois résultats distincts; une utilisation de strcmp() pour trier des chaînes de caractères. La question est de savoir comment vous voulez attribuer des valeurs à ces trois résultats, et la façon de garder les choses plus ou moins cohérente. Vous pouvez également regarder les paramètres de qsort() et brecherche(), qui nécessitent des fonctions de comparaison de beaucoup comme strcmp().
Si vous vouliez une chaîne de l'égalité de la fonction, il serait de retour différent de zéro pour l'égalité des chaînes de caractères et zéro pour les non-égalité des chaînes de caractères, pour aller avec C du règlement sur le vrai et le faux. Cela signifie qu'il n'y aurait aucun moyen de distinguer si la chaîne 1 est venu avant ou après la chaîne 2. Il y a plusieurs vraies valeurs pour un int, ou tout autre type de données C vous de soins de nom, mais un seul faux.
Par conséquent, avoir une utile strcmp() a renvoyé true pour la chaîne de l'égalité exigerait beaucoup de changements pour le reste de la langue, qui ne sont tout simplement pas qui va se passer.
Je suppose que c'est tout simplement pour la symétrie: -1 s'il est inférieur, 0 en cas d'égalité, 1 si plus.