2015-12-14 1 views
0
char string1[10]; 
char string2[10]; 

strcpy(string1, "hello"); 
strcat(string2, string1); 

if(strcmp(string1, string2)){ 
    printf("Heellloww!!!); 
} else { 
    printf("Bye"); 
} 

strcmp() Lorsque j'effectue contrôle sur if(strcmp(string1, string2)) alors ce qui devrait strcmp() retour? Devrait-il toujours retourner 1 positif afin d'exécuter les déclarations en if?Confusion sur la logique lorsque vous utilisez la fonction

+0

Vos questions sont toutes répondues dans la [page de manuel strcmp] (http://linux.die.net/man/3/strcmp). Lisez cela en premier et revenez pour demander s'il y a quelque chose que vous ne comprenez pas. BTW, votre 'strcat' est incorrect. Les deux paramètres doivent être des chaînes valides. Mais 'string2' n'est pas initialisé et contient des indésirables. – kaylum

+0

À moins que votre question ne porte sur les valeurs considérées comme «vraies» dans une instruction «if». Dans ce cas, ce n'est pas une question 'strcmp' mais une question de base de C. Et la réponse serait n'importe quelle valeur à l'exception de '0' évalue à vrai dans C. – kaylum

+0

Puisque string1 et string2 ont la taille 10, vous devriez vérifier les tailles avant d'émettre le strcat afin de vous assurer que vous n'avez pas de débordement. Sinon, si strlen (string1) + strlen (string2)> 9, vous obtiendrez un buffer overflow avec les mauvais résultats. Bien sûr, cela suppose que vous avez correctement défini les valeurs plus tôt dans le code (ou initialisé les deux à des chaînes valides). – sabbahillel

Répondre

2

Le problème avec votre code est strcat: il provoque undefined comportement.

Pour que strcat fonctionne, les deux chaînes qui lui sont transmises doivent être terminées par un caractère nul. Toutefois, la première chaîne que vous transmettez est et non terminée par un caractère nul - en fait, elle n'est pas initialisée.

résolution de ce problème est simple - vous pouvez placer zéro dans la position initiale de string2 à déclaration:

char string2[10] = { 0 }; 

Maintenant, les chaînes seraient considérées comme égales, ce qui signifie que strcmp retournerait à zéro. Si vous voulez Heellloww imprimé lorsque deux chaînes sont les mêmes, vous devez ajouter == 0 à votre déclaration if.

2

Toujours vérifier le manuel:

int strcmp(const char *s1, const char *s2);

Valeur de retour: Le strcmp() et strncmp() renvoient un entier inférieur, égal ou supérieur à zéro si s1 (ou les n premiers octets de celui-ci) sont, respectivement, inférieurs à, correspondent ou supérieurs à s2.

Dans votre cas, strcmp renvoie zéro si string1 et string2 sont les mêmes (ou jeu). Donc dans le cas où ils sont le même, vous devez imprimer Bye, et si elles sont différentes, alors vous imprimer Heellloww.