AnfÀngerfrage zu scanf und Fließkommazahlen

24/02/2009 - 20:16 von Michael Wagner | Report spam
Hallo Leute,

bin gerade dabei C zu lernen und hàtte eine Verstàndnisfrage. Zum Lernen
hab ich mir das Buch "C Programmierung - leicht - klar - sofort" von
Jürgen Wolf gekauft, mit dem ich eigentlich ganz gut zurechtkomme. Aber
beim Ausprobieren bin ich jetzt auf etwas gestossen, das ich mir nicht
erklàren kann. Folgendes Programm hab ich geschrieben:


#include <stdio.h>

int main()
{
double wert;

printf("Bitte geben Sie eine Fließkommazahl ein");
scanf("%f",&wert);

printf("Fließkommazahl : %f",wert);
printf("Exponential : %e und %E",wert,wert);
printf("Kompakt : %g und %G",wert,wert);

return 0;
}


Wenn ich das mit dem gcc-4.3 kompiliere, kriege ich keine vernünftige
Ausgabe. Die sieht dann immer so aus, egal, welche Zahl ich eingebe:

Bitte geben Sie eine Fließkommazahl ein
123.1234
Fließkommazahl : 0.000000
Exponential : 4.854880e-270 und 4.854880E-270
Kompakt : 4.85488e-270 und 4.85488E-270

Wenn ich aber die Variable "wert" gleich im Programm mit "123.1234"
deklariere und die Abfrage mit "scanf" weglasse, dann ist die Ausgabe so
wie sie laut Buch sein soll.

Das gleich gilt, wenn ich statt "double" "float" verwende. Auch wenn ich
"long double" hernehme und den Formatbezeichnern jeweils noch ein *l*
davorsetze, funktioniert es. Jetzt ist mir nicht ganz klar warum es mit
"double" nicht funktioniert. Könnte mir das bitte einer erklàren, wo
mein Denkfehler ist.

TIA Michael

"I read the news today oh boy"
- The Beatles - A Day In The Life
 

Lesen sie die antworten

#1 Alexander Bartolich
24/02/2009 - 20:29 | Warnen spam
Michael Wagner schrieb:
[...]
Wenn ich das mit dem gcc-4.3 kompiliere, kriege ich keine vernünftige
Ausgabe.



$ gcc -Wall michael.c
michael.c: In function 'main':
michael.c:8: warning: format '%f' expects type 'float *', but argument 2 has type 'double *'

Probiers mal mit

scanf("%lf",&wert);

[...]
Wenn ich aber die Variable "wert" gleich im Programm mit "123.1234"
deklariere und die Abfrage mit "scanf" weglasse, dann ist die Ausgabe so
wie sie laut Buch sein soll.

Das gleich gilt, wenn ich statt "double" "float" verwende.



Bei scanf: %f für »float*«
%lf für »double*«
%LF für »long double*«

Bei printf ist das im Prinzip gleich, nur gibt es die Feinheit, dass
ein »float« automatisch zu »double« wird, wenn der Funktionsprototyp
nichts anderes sagt.

Auch wenn ich "long double" hernehme und den Formatbezeichnern jeweils
noch ein *l* davorsetze, funktioniert es.



Das kann ich nicht glauben.

seq 0 1 99 | xargs -I. echo 'Romani Ite Domum!'

Ähnliche fragen