Comment puis-je imprimer une chaîne non terminée par null à l'aide de printf, en supposant que je connais la longueur de la chaîne au moment de l'exécution?
printf("%.*s", length, string);
À utiliser avec d'autres arguments:
printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
// ^^^^ ^^^^^^^^^^^^^^
En C, vous pouvez spécifier la longueur maximale de sortie avec le %.123s
format. Cela signifie que la longueur de sortie est au maximum de 123 caractères. Le 123
pourrait être remplacé par *
, de sorte que la longueur sera prise à partir de l'argument de printf au lieu de codé en dur.
Notez que cela suppose que string
ne contient aucun octet nul intérieur (\ 0), comme %.123s
limite uniquement la longueur maximale et non la longueur exacte et les chaînes sont toujours traités comme étant à terminaison nulle.
Si vous voulez imprimer une chaîne non terminée par null avec null intérieur, vous ne pouvez pas utiliser un seul printf. Utilisez à la place fwrite
:
fwrite(string, 1, length, stdout);
Voir @ la réponse de M.S.Dousti pour une explication détaillée.
La réponse fournie par @KennyTM est excellente, mais avec une subtilité.
En général, si la chaîne n'est pas "terminée" non nulle, mais a un caractère nul au milieu, printf("%.*s", length, string);
ne fonctionne pas comme prévu. C'est parce que le %.*s
la chaîne de format demande à printf
d'imprimer maximum de length
caractères, pas exactementlength
caractères.
Je préfère utiliser la solution plus générale indiquée par @William Pursell dans un commentaire sous l'OP:
fwrite(string, sizeof(char), length, stdout);
Voici un exemple de code:
#include <stdio.h>
int main(void) {
size_t length = 5;
char string[length];
string[0] = 'A';
string[1] = 'B';
string[2] = 0; // null character in the middle
string[3] = 'C';
string[4] = 'D';
printf("With printf: %.*s\n", length, string);
printf("With fwrite: ");
fwrite(string, sizeof(char), length, stdout);
printf("\n");
return 0;
}
Production:
With printf: AB
With fwrite: AB CD