45 votes

Est-il légal de passer une chaîne avec une terminaison non nulle à strncmp en C?

J'ai un tableau de 16 octets qui contient le nom de l'exécutable du segment.

char segname[16];

Si le nom de segment de longueur de moins de 16 octets, alors le reste est rembourré avec des octets nuls. Sinon, il n'y a pas d'octet nul final.

Je veux comparer segname de chaînes différentes, par exemple, __text.

Est-il légal de faire appel strncmp , avec une non-null-terminated string?

Ce poste suppose que c'est légal. Ce code source permet-il légal aussi. Mais mon homme est à la page dit:

L' strncmp() fonction compare lexicographiquement le null cordes s1 et s2.

La taille passé de strncmp sera la taille de l' segname.

Je me demandais ce que je devrais consulter.

67voto

giusti Points 2209

Selon le standard C99, section 7.21.4.4, §3., il est légal:

L' strncmp fonction retourne un entier supérieur, égal ou inférieur à zéro, en conséquence que les éventuellement terminée par null tableau pointé par s1 est supérieur, égal ou inférieur à l' , éventuellement, null tableau pointé par s2.

Notez, cependant, qu'il dit tableau de caractères. Par définition, si un tableau de caractères n'est pas nul, c'est pas une chaîne.

15voto

coderredoc Points 27302

La fonction strncmp compare pas plus de n caractères qui suivent un caractère null ne sont pas comparées) à partir du tableau pointé par s1 dans le tableau pointé par s2.

Spécification 7.24.4.2 dit que.C11 standard.

Les caractères qui ne suivent pas un null charcaters ne sont pas contre donc il s'attend à null terminé tableau de caractères ou une chaîne.1

Vous pouvez utiliser la non-null personnages trop ici, mais dans ce cas, nous devons spécifier la longueur jusqu'à qui nous devons vérifier ce qui est utile dans certains cas.

Corrections


[1] Que les caractères qui ne suivent pas un caractère null ne sont pas comparés ne signifie pas qu' strncmp attend null cordes. Cela signifie seulement que, strncmp des besoins d'un cas particulier, de manière à dire (par exemple) qu' abc\0def... et abc\0xyz... comparer l'égalité. Il n'y a rien de mal avec la comparaison de deux tableaux de char qui ne sont pas null (jusqu'à la longueur spécifiée) ou de comparer une valeur null char tableau avec un autre qui n'est pas null
C'est ajouté directement à partir du commentaire de David Hammen

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X