Comment puis-je imprimer un non-null-terminated string à l'aide de printf?
Comment puis-je imprimer un non-null-terminated string à l'aide de printf, en supposant que je sais que la longueur de la chaîne au moment de l'exécution?
- Pourquoi ne pas utiliser fwrite?
- Si ce n'est pas null, alors, par définition, ce n'est pas une chaîne.
- c'est seulement pas une chaîne c, comme ce devrait être une chaîne valide dans d'autres langues.. et si un "non-null tableau de char" serait plus précis, je suis sûr que c'était universellement compris.
- Double Possible de à l'Aide de printf avec un non-null string
Vous devez vous connecter pour publier un commentaire.
Utiliser conjointement avec d'autres arguments:
En C, vous pouvez spécifier la longueur maximale de sortie avec la
%.123s
format. Cela signifie que la longueur de sortie est à plus de 123 caractères. Le123
pourrait être remplacé par*
, de sorte que la longueur seront prises à partir de l'argument de printf, au lieu de codé en dur.Noter que ceci suppose que l'
string
ne contient pas n'importe quel intérieur d'octet nul (\0),%.123s
seulement contraint le maximum longueur pas le exacte longueur, et les chaînes sont toujours traités comme null.Si vous souhaitez imprimer un non-null-terminated string avec intérieur null, vous ne pouvez pas utiliser un simple printf. Utilisation
fwrite
à la place:Voir @M. S. Dousti réponse pour une explication détaillée.
length
doit être de typeint
ici, après le défaut de l'argument des promotions. Si votrelength
variable est quelque chose de plus grand (par exemple,size_t
), vous devriez jeter aux(int)
le reste de votre code break sur une plate-forme oùsize_t
est plus large queint
.La réponse fournie par @KennyTM est grande, mais avec une subtilité.
En général, si la chaîne est non null, "terminé", mais a un caractère nul dans le milieu,
printf("%.*s", length, string);
ne fonctionne pas comme prévu. C'est parce que le%.*s
format de la chaîne demandeprintf
pour imprimer un maximum delength
caractères, pas exactementlength
caractères.Je préfère utiliser la solution générale l'a souligné @William Pursell dans un commentaire sous l'OP:
Voici un exemple de code:
De sortie:
sizeof (char)
est de 1 par définition. Aussi,NULL
est spécifiquement null pointeur constante.'\0'
est plus sémantique que0
. Mais qui s'en soucie 😉