Pourquoi ma comparaison de chaîne d'échouer?
Disons que j'ai le code suivant et de sortie:
for (j = 0; j <= i; j++)
printf("substring %d is %s\n", j, sub_str[j]);
De sortie:
substring 0 est max_n=20 sous-chaîne 1 est max_m=20
Maintenant, je ne souhaite imprimer des sous-chaînes. Cependant, si j'essaie de le faire de façon conditionnelle:
for (j=0; j <=i; j++) {
if (sub_str[j] == "max_n=20") {
printf("substring %d is %s\n", j, sub_str[j]);
}
}
Je n'ai pas de sortie du tout. Quel est le problème avec mon code?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser
==
pour comparer des chaînes de caractères en C. Vous devez utiliserstrcmp
.Vous ne pouvez pas comparer des chaînes de caractères en C avec l'opérateur==. Vous avez besoin d'utiliser strcmp fonction ou strncmp.
Assurez-vous d'utiliser strncmp et pas strcmp. strcmp est profondément dangereux.
BSD pages de manuel (tout nix vous donne cette info tout de même):
Le strcmp() et strncmp() fonctionne de manière lexicographique comparer les null chaînes de caractères s1 et s2.
La strncmp() la fonction compare pas plus de n caractères. Parce que strncmp() est conçu pour comparer des chaînes de caractères plutôt que des données binaires, des personnages qui apparaissent après un `\0' caractère ne sont pas comparés.
Le strcmp() et strncmp() renvoie un entier supérieur, égal ou inférieur à 0, selon que la chaîne s1 est supérieure, égale ou inférieure à la chaîne s2. La comparaison est effectuée à l'aide de caractères non signés, de sorte que
\200' is greater than
\0'.À partir de: http://www.codecogs.com/reference/c/string.h/strcmp.php?alias=strncmp
strcmp
est moins sûr questrncmp
. En tout sane mise en œuvre, les deux fonctions d'arrêter la lecture à la première\0
(je crois que cela est requis par la norme). Si vous avez un non-null-terminated string, vous ne devriez pas être à l'aide de la str* fonctions de toute façon.strncmp
n'est pas plus sûr...strncmp
à offrir tout plus de sécurité à tous, mais les gens de lire quelque chose qui dit, "X est plus sûr que d'Y", et y croire sans nécessairement savoir ce qu'il signifie.size_t
comme le dernier argument. Personnellement, je n'ai jamais vu la valeur de aucun de la strn* fonctions bien questrncmp
est particulièrement inutile par exemple.memcmp
est que dans les cas où les deux chaînes sont correctement nul terminée, et arriver à être à égalité, cela permettrait de garder le comparant au-delà de la nul de terminaison à la fin de l'tampons, et indiquent peut-être un faux négatif pour l'égalité comme un résultat. Le problème de fond est que si vous ne faites pas confiance à votre entrée pour être NUL terminée, et votre entrée est juste unchar*
(ou d'une matrice dechar*
dans ce cas), puis il n'y a rien que vous pouvez faire avec elle. "Coffre-fort" fonctions ou "dangereux", si vous ne savez pas ce que le format de l'entrée n'est alors que c'est inutile.strncmp
est aussi profondément dangereux. Pour que la matière est donc le langage de programmation C. Il n'y a pas de substitut en C pour savoir ce qu'ils font.strncmp
est en fait pour, est de comparer les "chaînes" qui seraient copiés avecstrncpy
. C'est, à largeur fixe des tableaux de caractères qui peut être tronquée avec un octet NUL, mais qui ne sont pas NUL-fin si ils sont en pleine largeur, et aussi besoin de ne pas être 0-collier commestrncpy
n'. Si quelqu'un est à l'aide destrncmp
avec autre chose que de l'archaïque enregistrements de données (par exemple, certains spécifiques à la plateforme du système de fichiers structures), les chances sont qu'ils ont choisi le mauvais jeu de "coffre-fort" de la chaîne de fonctions de gestion, même accordée qu'une sorte de tampon-longueur de la sécurité en vaut la peine.Vous pouvez utiliser
strncmp
:Note le 9 est la longueur de la comparaison de chaîne, plus la finale
'\0'
.strncmp
est un peu plus sûr questrcmp
parce que vous spécifiez le nombre de comparaisons seront faites au plus.sub_str[0]
pointe vers une chaîne"max_n=200"
, cet appel àstrncmp
indiquera l'égalité. Puisque vous avez fait une erreur, où Starkey n'a pas, cela signifiestrncmp
est moins sûr questrcmp
, pas plus ;-psub_str[j]
points à, si elle est plus courte que la chaîne de caractères littérale et n'est pas lui-même nul de terminaison. La sécurité questrncmp
offre est si vous savez combien de temps la mémoire tampon est censés, mais ne sais pas son contenu, et l'utilisationstrncmp
pour vous assurer que vous n'avez pas de dépassement. Dans ce cas, nous savons qu'un littéral de chaîne est toujours nul terminée, et nous ne savons pas combien de temps les autres tampon est censé être, ce n'est donc pas l'utiliser du tout. Elle garantit pas plus de 9 comparaisons: et donc nestrcmp
parce que nous savons que les littéraux sont terminées.strncmp
, mais en général, bouding boucles est mieux que pas d'attaches.strcpy_s
peut avoir des avantages certains surstrcpy
, bien que je n'irais jamais jusqu'à l'appeler "sûr" que certains le font). Dans certains cas (y compris celui-ci), c'est juste une petite chose que le programmeur peut se tromper, en plus de toutes les choses à disposition de mal avant.strcmp
.