36 votes

La corde devient folle si je ne lui donne pas un peu plus de place. Quelqu'un peut-il expliquer ce qui se passe ici?

Tout d'abord, je tiens à dire que je suis novice en C / C++, je suis à l'origine d'un développeur PHP, donc je suis de race à l'abus des variables de toute façon je les aime.

C est une stricte pays, les compilateurs ne sont pas comme moi ici très bien, je suis habitué à enfreindre les règles pour obtenir des choses faites.

De toute façon, c'est mon simple morceau de code:

char IP[15] = "192.168.2.1";
char separator[2] = "||";   

puts( separator );

Sortie:

||192.168.2.1

Mais si je change la définition d' separator à la:

char separator[3] = "||";

J'obtiens le résultat souhaité:

||

Pourquoi n'ai-je besoin de donner à l'homme un espace supplémentaire, de sorte qu'il ne dort pas avec l'homme avant de lui?

45voto

sharptooth Points 93379

C'est parce que c'est pas null chaîne lors de l' separator de la longueur est forcé à 2.

Rappelez-vous de toujours attribuer un caractère supplémentaire pour le terminateur null. Pour une chaîne de longueur N vous avez besoin d' N+1 caractères.

Une fois que vous contrevenez à cette exigence tout code qui attend null chaînes (puts() fonction incluse), vers un comportement indéfini.

Votre meilleur pari est de ne pas forcer une longueur spécifique:

char separator[] = "||";

va allouer un tableau de exactement la bonne taille.

22voto

NPE Points 169956

Les chaînes en C sont terminées par NUL. Cela signifie qu'une chaîne de deux caractères nécessite trois octets (deux pour les caractères et le troisième pour l'octet zéro qui désigne la fin de la chaîne).

Dans votre exemple, il est possible d'omettre la taille du tableau et le compilateur allouera la quantité de stockage appropriée:

 char IP[] = "192.168.2.1";
char separator[] = "||";
 

Enfin, si vous codez en C ++ plutôt qu'en C, utilisez plutôt std::string .

13voto

Frank Schmitt Points 13554

Si vous utilisez quand même le C ++, je vous conseillerais d'utiliser la classe std :: string au lieu des chaînes C, ce qui est beaucoup plus facile et moins sujet à l'erreur, à mon humble avis, en particulier pour les personnes ayant des connaissances en langage de script.

4voto

Bo Persson Points 42821

Il y a un caractère nul caché '\ 0' à la fin de chaque chaîne. Vous devez laisser de la place pour ça.

Si tu fais

 char seperator[] = "||";    
 

vous obtiendrez une chaîne de taille 3, pas de taille 2.

3voto

davmac Points 4317

Parce qu'en C, les chaînes de caractères sont nul de résiliation (leur fin est marquée par un 0 octet). Si vous déclarez séparateur à un tableau de deux personnages, et de leur donner à la fois une valeur non-nulle, alors il n'y a pas de terminator! Par conséquent, lorsque vous puts le tableau à peu près tout ce qui pourrait être cloué sur la fin (ce qui arrive à s'asseoir dans la mémoire passé la fin du tableau - dans ce cas, il apparaît que c'est l' IP tableau).

Edit: ce qui suit est incorrect. Voir les commentaires ci-dessous.

Lorsque vous faites la longueur du tableau 3, l'octet supplémentaire est de 0, ce qui termine la chaîne. Cependant, vous ne pouvez probablement pas compter sur ce comportement - si la valeur est initialisée, il pouvait vraiment rien contenir.

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