2017-06-19 2 views
0

J'ai fatigué de comparer la chaîne de telle façon:comparaison pour les chaînes en C. tampon contre une chaîne littérale

if(strcmp(buf, "AUTHENTICATE") != 0) { 

Mon tampon contient « AUTHENTICATE » chaîne à l'intérieur comme vous pouvez le voir sur l'inspecteur du débogueur. Mais le résultat est que strcmp renvoie une valeur différente de 0. Pourquoi? enter image description here

+1

juste une conjecture sauvage: est-ce que 'buf' contient l'octet de fin '' \ 0 ''? S'il y a des informations vitales sur l'image, veuillez le fournir comme texte dans votre question. –

+0

que faire si vous comparez le buf vide? validez-vous buf n'est pas vide? – LethalProgrammer

+0

Il contient. L'exemple semble fonctionner maintenant. J'ai fait du nettoyage, j'ai construit plusieurs fois et j'ai commencé à travailler. Donc, le code ci-dessus fonctionne correctement! –

Répondre

2

Pour rappel, strcmp est censé comparer 2 chaînes, caractère par caractère, et retourne chaque fois que 2 caractères sont différents. Dans ce cas, la fonction renvoie la différence entre la valeur ASCII du premier et la valeur ASCII de la seconde. Si un caractère \0 est rencontré, il s'agit du dernier caractère évalué de la chaîne avant le retour de la fonction.

Je vois 2 raisons possibles pour lesquelles strcmp retournerait une autre valeur que 0 lorsque vous vous attendez à retourner 0.

  1. Si votre buf est une entrée utilisateur, il peut contenir une fin \n, que le chaîne littérale "AUTHENTICATE" ne contient pas. Cela dépend de la façon dont vous traitez avec l'entrée: quelles fonctions utilisez-vous, faites-vous stocker toute entrée dans buf, etc ...
  2. votre buf ne contient pas de terminaison NUL. Notez que dans ce cas, buf n'est pas une chaîne valide. S'il vous plaît noter que strcmp continuera d'évaluer les deux chaînes jusqu'à ce qu'il trouve un caractère \0, ce qui signifie que si buf n'en contient pas, strcmp continuera à lire en mémoire après que le dernier caractère contenu dans buf a été évalué, ce que vous ne voulez certainement pas.