2013-08-23 4 views
1

je donc ce (pas le code complet)STRCMP ne compare pas correctement les chaînes

char list[1000][10];

strcpy(list[0],"ab");

printf("%d\n",strcmp(list[0],"ab"));

et strcmp retourne 0. Quelqu'un peut-il expliquer pourquoi ça le fait?

Merci d'avance.

+0

Que contient 'list [0]'? –

+4

Comme les deux chaînes comparées sont égales, 'strcmp' renvoie' 0'. –

+0

http://linux.die.net/man/3/strcmp, http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcmp.html, ou juste 'man strcmp' si votre système a le' man 'commande. –

Répondre

7

La méthode strcmp renverra 0 si list[0] contient «ab» dans ce cas.

Elle retourne:

Renvoie une valeur entière indiquant la relation entre les cordes:

Une valeur nulle indique que les deux chaînes sont égales.

Une valeur supérieure à zéro indique que le premier caractère qui ne correspond pas a une valeur plus grande dans str1 que dans str2; Et une valeur inférieure à zéro indique le contraire.

+0

oh je pensais que les fonctions retournent généralement 1 quand elles sont vraies. –

+1

@HasanSaad: Cela dépend de la fonction. 'strcmp' ne retourne pas une valeur vraie ou fausse.Ne jamais essayer d'utiliser une fonction avant d'avoir lu la documentation de cette fonction –

+0

@ HasanSaad "Je pensais" - ne fais pas ça. ** Ne fais pas d'hypothèses. * Jamais. *** Lis la documentation –

0

strcmp() fait un comparaison ordinale des cordes, pas une égalité test. La valeur de retour de 0 signifie que les chaînes sont égales!

Si vous voulez tester l'utilisation de l'égalité ce modèle:

if (strcmp(s, "ab") == 0) { 
    // strings are equal 
} 
0

Parce que strcpy() est une fonction qui copie la chaîne « droite » à la chaîne « gauche ». Ainsi, après strcpy(list[0],"ab");, le contenu de list[0] est "ab". Ensuite, ce sont des chaînes égales, et strcmp renvoie 0, ce qui signifie "égal".

0

Votre chaîne est adaptée qui est la raison pour laquelle il retourne 0 faire comme ça ...

char list[1000][10]; 

    strcpy(list[0],"ab"); 
    if(strcmp(list[0],"ab")==0) 
     printf("Matched\n",); 
0

Comme mentionné par Daniel, la valeur Returnd est 0.

Taken de cplusplus.com

Renvoie une valeur intégrale indiquant la relation entre les chaînes : Une valeur nulle indique que les caractères ont été comparés dans les deux les chaînes forment la même chaîne. Une valeur supérieure à zéro indique que le premier caractère qui ne correspond pas a une valeur plus grande dans str1 que dans str2; Et une valeur inférieure à zéro indique le contraire.

Vous devez également travailler avec strncmp plutôt qu'avec strcmp.

+0

'strncmp' n'est pas toujours meilleur que' strcmp'. Tant que vous savez que les deux arguments sont des chaînes valides, et que vous voulez comparer les chaînes entières et pas seulement une sous-chaîne initiale, 'strcmp' est correct. –

+0

Aucun cplusplus.com, s'il vous plaît. Premièrement, la question est marquée C. Deuxièmement, cplusplus.com est un site horrible avec des inexactitudes totales. [this] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcmp.html) est mieux. –

+0

Il se peut que cplusplus.com soit un site horrible et surtout à propos de C++. Mais dans ce cas, la réponse semble être bonne et la référence est aussi sur C. Et bon point par Keith, il a raison. – pzaenger

Questions connexes