[C] Float mit scanf einlesen

#2416444
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
Persönliche Seite #2416464
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?
#2416465
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.
#2416472
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren