web-dev-qa-db-fra.com

Comment imprimer une chaîne non terminée par null à l'aide de printf?

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?

62
Mike
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.

101
kennytm

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
19
M.S. Dousti