11
votes

PrintF Spécifier la chaîne de format entier pour flotter

0

1 commentaires

#include supprimé car pas nécessaire - d'autres nettoyages aussi.


7 Réponses :


4
votes

Vous devez utiliser une chaîne de formatage différente, il suffit de regarder http://www.cplusplus.com/reference/clibrary/cstdio/printf/ < / a>

printf ("% f", a);


0 commentaires

13
votes

Il n'imprime pas 5 car le compilateur ne sait pas automatiquement à un entier. Vous devez faire (int) a code> vous-même.

c'est-à-dire à dire, p> xxx pré>

sortie correctement 5. p>

Comparez ce programme avec P>

#include<stdio.h>
void print_int(int x)
{
printf("%d\n", x);
}
void main()
{
float a=5;
print_int(a);
}


3 commentaires

Plus précisément, il ne sait pas automatiquement à un entier dans une fonction variadique, mais c'est plutôt difficile à expliquer au débutant, en particulier car il semble certainement que le compilateur C devrait connaître les types concernés.


Outre la variable-ness, sachant quel type à mouler nécessiterait que le compilateur d'analyser la chaîne a été transmis à imprimerf et déduire quel type A est censé être. GCC peut facilement gérer une "% d \ n" constante et vous avertir lorsque vous avez passé -wall , mais bonne chance lorsque la chaîne n'est pas codée dur dans le programme!


@Markrushakoff Les programmeurs raisonnables n'utilisent pas de chaînes de format non constant, car ils introduisent un problème de sécurité.



13
votes

% d Spécificateur de format ne peut être utilisé que avec des valeurs de type int . Vous passez un double (quel float sera implicitement converti en). Le comportement résultant est indéfini. Il n'y a pas de réponse à "pourquoi il imprime 0?" question. Tout peut être imprimé. En fait, tout peut arriver.

P.s.

  1. c'est int Page principale , pas void principal .
  2. Il n'y a pas de telle en-tête que conio.h dans la norme c.

1 commentaires

+1 pour souligner que Printf () est passé un double. J'ai corrigé le code pour supprimer le superflu et non pertinent #include .



4
votes

Vous voudrez utiliser% F pour imprimer une valeur de flotteur.

par exemple xxx


0 commentaires

6
votes

Vous devez le jeter sur un Int pour utiliser% d ou utiliser une chaîne de format pour afficher le flotteur sans précision décimale:

int main() {
  float a=5;
  printf("%d",(int)a); // This casts to int, which will make this work
  printf("%.0f",a); // This displays with no decimal precision
}


0 commentaires

5
votes

Vous devez utiliser % f au lieu de % d - % d est juste pour les entiers tandis que % f est pour le point flottant: xxx


0 commentaires

2
votes

Comme les autres personnes ont dit, vous devez utiliser % f code> dans la chaîne de format ou convertir a code> sur int.

mais je veux souligner que Votre compilateur est probablement connu sur printf () code> S chaîne de format et peut vous dire que vous utilisez le problème. Mon compilateur, avec l'invocation appropriée ( -wall code> inclut -wformat code>), dit ceci: p> xxx pré>

oh, et une autre chose: vous devriez inclure '\ n' dans le printf () code> pour vous assurer que la sortie est envoyée sur le périphérique de sortie. P>

printf("%d\n", a);
/*        ^^ */


0 commentaires