2010-12-10 32 views
1

J'ai un tableau de u_chars et je veux l'imprimer en utilisant printf. Je ne connais pas la taille du tableau:Impression d'un tableau de u_chars

u_char *ip_p; 
printf("%s", ip_p); // EXC_BAD_ACCESS D:< 

Je veux imprimer ça. Comment puis-je faire ceci?

+0

Vous êtes confronté à cela si '* ip_p' pointe vers un bloc qui n'est pas terminé par' NULL'. Comment est-ce que le bloc pointé de 'ip_p' est lu en lecture/acquis/etc.? – birryree

+0

Il s'agit d'une structure affectée à partir de données brutes. Ce n'est en effet pas NULL-terminé. Mais si je ne connais pas la taille du tableau, comment puis-je ajouter un caractère NULL? –

Répondre

6

Cela ne peut être fait. Un pointeur ne contient pas par magie des informations sur la taille des données pointées.

S'il n'y a pas de convention (un octet de terminaison, ou une longueur codée quelque part), vous ne pouvez pas savoir combien de données est valide, et donc combien imprimer.

0

Si ip_p est terminé NUL, votre code fonctionne. Vous cherchez le commentaire dans votre fragment de code, je dirais qu'il n'est pas terminé ...

1

Si vous ne connaissez pas la taille, comment voulez-vous savoir printf? Fixez votre code pour passer la taille comme argument supplémentaire. Ensuite, vous pouvez utiliser:

printf("%.*s", size, buf); 

Cependant, il semble que vos données ne soient pas écrites mais binaires. Si oui, je doute de la valeur de l'impression avec printf ...

0

Si vous ne connaissez pas la taille des données, comment pouvez-vous espérer l'utiliser? La taille doit avoir été disponible quelque part sinon comment a-t-elle été mise là? Vous devez connaître la taille ou avoir une valeur sentinelle, par exemple un caractère nul.

Si elle n'est pas terminée à zéro, alors "% s" est un spécificateur de format inapproprié. De même, si les valeurs u_char ne sont pas tous des caractères imprimables, vous ne devez pas utiliser% s ou même% c. Vous pouvez utiliser% c et remplacer les caractères non imprimables par un autre.