Bonjour,
J'ai fait quelques tests avec la fonction printf
Si j'ai bien compris, une specification de conversion est sous la forme "%[flags][width][precision][len]type" :
- Valeurs possibles de flags : '+', '#', 'espace', '-'.
- width : nombre décimal ne commençant pas par '0'.
- precision : nombre décimal précédé du caractère '.'. Si nombre à virgule, nombre decimal à afficher, sinon si %s, c'est la taille maximale de la chaine à afficher, sinon champ non pris en compte.
- Valeurs possibles de len : "l", "ll", "L", "h", "hh", "z".
- Valeurs possibles de type: '%', 'c', 's', 'i', 'd', 'u', 'x', 'X', 'p', 'f', 'F', 'e', 'E', 'g', 'G' (il en existe d'autres mais toutes ce sont pas supportées par la plupart des plateformes).
A quoi correspond le chiffre juste après le caractère espace ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4printf("\"% 6.2f\"\r\n", 1.234); // affiche " 1.23" printf("\"% 3.2f\"\r\n", 1.234); // affiche " 1.23" printf("\"% 4.6f\"\r\n", -0.5); // affiche " -0.500000"
=> en lisant la documentation, j'avais l'impression que ça correspondait à la taille minimal de la chaine générée mais ce n'est pas ce qui est affiché :
- sur la seconde ligne, il y a un espace en trop
- sur la troisième ligne, il y a un espace en trop
Aussi, pouvez-vous me confirmer que les cas suivants ont la même signification ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4// Même signification ? printf("\"% 6.2f\"\r\n", 1.234); printf("\"%6.2f\"\r\n", 1.234);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // Même signification ? printf("\"% .2f\"\r\n", 1.234); printf("\"% 0.2f\"\r\n", 1.234); printf("\"% 01.2f\"\r\n", 1.234);Pour moi, les règles sont les suivantes (dites moi si je me trompe) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // Même signification ? printf("\"%-0 6.2f\"\r\n", 1.234); printf("\"% 0-6.2f\"\r\n", 1.234);
- Le flag '-' est prioritaire sur le flag '0' qui est prioritaire sur le flag 'espace'.
- Si pas de flag dans la séquence, le flag 'espace' est actif.
- Si le champ width n'est pas défini, alors il vaut 1.
- Le champ width ne peut pas être défini avec la valeur 0 car en conflit avec le flag '0'.
- Le champ width désigne la taille minimale de la chaine généré, alors que le champ precision correspond au nombre de chiffres après la virgule
Merci d'avance





Répondre avec citation








... donc pour avoir du code portable, il faut utiliser vraiment que les fonctions de base (même la gestion des arrondis d'un float a l'air de dépendre de l’implémentation de printf utilisée).

Partager