Pourquoi la spécification de conversion% lf ne fonctionne pas pour Double dans printf

J’écris un très petit code juste scanf et printf . Je lis une valeur double et l’imprime. La spécification de conversion %lf fonctionne correctement pour lire une valeur double. Mais cela ne fonctionne pas avec printf.

Lorsque j’essaie d’imprimer cette valeur, je reçois une sortie telle que 0.000000

 double fag; scanf("%lf", &fag); printf("%lf", fag); 

Mais, si j’utilise% f dans printf, cela fonctionne correctement.

L’implémentation de la bibliothèque standard C que vous utilisez n’est pas conforme à C99 (ou plus récente). Les modifications répertoriées dans l’avant-propos (paragraphe 5) comprennent:

%lf spécificateur de conversion autorisé dans printf

La description du modificateur de longueur l est la suivante ( C99 + TC3 7.19.6.1, par. 7 , c’est moi qui souligne):

Spécifie qu’un spécificateur de conversion d , i , o , u , x ou X s’applique à un argument long int ou unsigned long int ; qu’un spécificateur de conversion n suivant s’applique à un pointeur sur un long int argument ; qu’un spécificateur de conversion c suivant s’applique à un argument wint_t ; qu’un spécificateur de conversion suivant s s’applique à un pointeur sur un argument wchar_t ; ou n’a aucun effet sur un spécificateur de conversion a, A , e , E , f , F , g ou G .

%f et %lf sont donc équivalents. Les deux attendent un double parce que les arguments correspondant aux points de suspension (the ... in int printf(char const * ressortingct, ...); ) sont soumis à la prétendue promotion des arguments par défaut. Entre autres choses, ils convertissent implicitement float en double . Cela n’a pas d’importance pour scanf() car les pointeurs ne sont pas convertis implicitement.

Donc, si vous ne pouvez pas ou ne voulez pas mettre à jour votre bibliothèque standard C plus récente, %f peut toujours être utilisé dans une chaîne au format printf() pour imprimer des float ou double . Cependant, dans les chaînes au format scanf() , %f s’attend à un float* et %lf double* .