Forum: PC-Programmierung [C] Float mit scanf einlesen


von Michael S. (rbs_phoenix)


Lesenswert?

Hallo zusammen. Ich bin dabei C zu lernen. Soweit geht das auch schon 
ganz gut, nur hab ich eine Frage bzw ein Problem mit/bei scanf.

Ich will eine Float-Zahl also eine "Kommazahl" eingeben. Das heißt, ich 
habe eine Variable "float zahl;" und beschreibe Diese mit " scanf("%f", 
&zahl); ".

Soweit funkioniert das auch. Doch als Europäer schreibt man die Zahl ja 
z.B. 4,5 und nicht wie die Amerikaner 4.5 . Wenn ich 4.5 eingebe, stimmt 
auch alles soweit. Doch wenn ich 4,5 eingebe, erkennt er nur eine 4.0. 
Ich kann auch "4jhaskdjkl5" eingeben, erkennen tut er nur die 4.

Ich hab es schon soweit geschafft, dass er es erkennt, wenn man nur 
Zeichen hat und dann eine Fehlermeldung ausgibt:
1
switch(scanf("%f", &zahl)){
2
   case 0:
3
      printf("Ungueltige eingabe");
4
      break;
5
   case 1:
6
      printf("%.3f", zahl);
7
      break;
8
}

Wie kann ich das machen, dass er nur bei einer wirklich gültigen 
Gleitkommazahl diese Zahl ausgibt?

Ich hoffe das Problem ist klargeworden.
Danke schonmal

von 123 (Gast)


Lesenswert?

Als String einlesen, mittels Schleife+isdigit() usw prüfen, wenn OK mit 
sscanf konvertieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lies die Benutzereingabe in einen String ein, ersetze in diesem 
gegebenenfalls Kommata durch Punkte und nutze dann sscanf auf diesem 
String.
Vorteil: Vor dem Aufruf von sscanf kannst Du auch noch weitere 
Plausibilitätsprüfungen anstellen.

Wenn Deine Runtime-Umgebung es unterstützt, kannst Du auch die 
sogenannte locale anpassen, dazu ist die Funktion setlocale für 
LC_NUMERIC zu verwenden - näheres solltest Du in der Dokumentation 
Deines Compilers finden.

Empfehlenswert ist es dennoch, statt scanf direkt auf 
Benutzereingaben anzuwenden, zunächst in einen String einzulesen, den 
auf Plausibilität zu überprüfen und erst dann sscanf zu verwenden.

Wie anders willst Du eine "ungültige Eingabe" von 0 unterscheiden?

von Karl H. (kbuchegg)


Lesenswert?

Michael Skropski schrieb:

> Wie kann ich das machen, dass er nur bei einer wirklich gültigen
> Gleitkommazahl diese Zahl ausgibt?
>
> Ich hoffe das Problem ist klargeworden.

Das ist ein ständiges Ärgernis.
Ganz besonders lustig wird es dann, wenn Kaufleute meinen, sie müssen 
ihre Tausenderpunkte auch noch eingeben


Wir machens so:
Als String einlesen
Im String ein eventuelles , durch einen . ersetzen
sscanf zum Frass vorwerfen.

von Udo S. (urschmitt)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wir machens so:
> Als String einlesen
> Im String ein eventuelles , durch einen . ersetzen
> sscanf zum Frass vorwerfen.
Wenn man es noch sicherer machen will kann man zusätzlich prüfen ob mehr 
als ein Punkt oder Komma in dem String ist oder ob irgendein anderes 
nichtnumerisches Zeichen in dem String enthalten ist.

von Michael S. (rbs_phoenix)


Lesenswert?

ok dann werde ich das so mal probieren, klingt jedenfalls plausibel;)
Vielen Dank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.