2017-04-01 3 views
-1

Dies ist ein Auszug aus einem Programm, das ich versuche zu schreiben, aber ich bekomme das gleiche Problem mit etwas so einfach. Wenn ich dies ausführe und "1.0" eingebe, wird "0.007812" ausgedruckt. Ich habe mir mehrere vorhergehende Fragen angesehen, die meinen ähneln und keine passende Antwort finden konnten.scanf sammelt die falsche Eingabe

+2

Haben Sie die falschen Formatspezifizierer für Double-Dateien verwendet? – ThingyWotsit

Antwort

3

Sie müssen "%lf" für Doppel verwenden.

Dies ist die Warnung von clang Compiler.

Warnung: Format spezifiziert type 'float *', aber das Argument 'double *' [-Wformat] scanf ("% f", & c) Typ;

Hier ist die scanf reference. Es ist das Format %[*][width][length]specifier. Der Spezifizierer für die Gleitkommazahl ist f. So verwenden wir %f, um float x zu lesen. Um double x zu lesen, müssen wir die Länge als l angeben. Kombiniert ist das Format %lf.

+2

Sie treffen den wichtigsten Punkt. ** Aktivieren Sie Warnungen ** in Ihrer Kompilierzeichenfolge (z. B. "-Wall -Wextra") und akzeptieren Sie keinen Code, bis er * ohne * Warnungen kompiliert. Gut gemacht. –

0

"% f" ist das (oder mindestens ein) korrekte Format für ein Doppel. Es gibt kein Format für einen Gleitkommawert, denn wenn Sie versuchen, einen Gleitkommawert an printf zu übergeben, wird er zu double hochgestuft, bevor printf ihn empfängt1. "% lf" ist auch unter dem aktuellen Standard akzeptabel - das l wird als unwirksam bezeichnet, wenn der f-Konvertierungsspezifizierer folgt (unter anderem).

Beachten Sie, dass dies ein Ort ist, an dem sich die Printf-Format-Strings erheblich von scanf- (und fscanf usw.) Formatzeichenfolgen unterscheiden. Bei der Ausgabe übergeben Sie einen Wert, der von float auf double hochgestuft wird, wenn er als variadischer Parameter übergeben wird. Für die Eingabe übergeben Sie einen Zeiger, der nicht hochgestuft wird, also müssen Sie scanf mitteilen, ob Sie ein float oder double lesen möchten, also bedeutet% f für scanf, dass Sie einen float und% lf wollen, was Sie wollen um ein Doppel zu lesen (und, was es wert ist, für ein langes Doppel, verwenden Sie% Lf für entweder printf oder scanf).

+1

Vielleicht möchten Sie "Man scanf" noch einmal überprüfen und Ihre Antwort leicht überarbeiten. –

1

the output Try% lf statt% f

#include<stdio.h> 

int main() 
{ 
double c; 
scanf("%lf",&c); 
printf("%lf",c); 
return 0; 
} 

Was Sie verwendet haben, ist % f, die für einen regelmäßigen float Datentyp verwendet wird. seit Sie double angegeben haben, müssen Sie % lf verwenden, die lange float ist. Es liest ein Doppel. hoffe das hilft dir.

Verwandte Themen