scanf() Problem

HankfromHell

Neues Mitglied
Hallo Leute,
ich bin gewiss nicht der erste der so ein Problem vorträgt aber ich werde leider aus den unzähligen Beiträgen nicht schlau.
Ich fange durch ein Elektrotechnik Studium grad erst an mit der Programmierung. Bisher habe ich schon SPS Programmiert aber mit einer "echte" Programmiersprache habe ich noch nie etwas zutun gehabt.
Von anderen Studierenden habe ich schon ein paar Übungsblätter bekommen mit denen ich mich schonmal ein bisschen beschäftigen wollte.
In einer Aufgabe soll durch vier Eingaben der BMI berechnet werden und bei der Ausgabe der Idealwert in abhängigkeit von Alter und Geschlecht berücksichtigt werden.
Leider klappt es nicht so ganz wie ich mir das vorstelle.
Ich schreibe mal meine Gedanken dazu auf sodass vielleicht jemand Punkt für Punkt sagen kann ob der Gedanke richtig oder falsch ist.
Als erstes habe ich die Variablen deklariert.
Die Größe soll in Meter angegeben werden. Daher habe ich mich für den Datentyp float entschieden.
Das Alter und das Gewicht wird ja als ganze Zahl eingegeben, daher hier Datentyp Integer.
Der berechnete BMI ist auch eine Kommazahl daher auch hier der Datentyp float.
Das Geschlecht wird durch den Benutzer entweder durch m oder w als char eingegeben.
Soweit so gut.
Dann folgen nacheinander die Eingabeaufforderungen.
Hier ist bereits das erste Problem. Komischerweise springt der Curser nach der Eingabe von einer Größe z.B. "1.84" (mit Punkt anstatt Komma) direkt an den Anfang der nächsten Zeile und das Programm läuft nicht weiter. Die do-while Schleife habe ich eben erst eingebaut weil ich nach eifriger Recherche bereits auf das Problem mit dem "Enter im Puffer" gestoßen bin und der fflush Befehl bei mir anscheinend nicht funktioniert.
Vorher funktionierte es, zumindest wenn ich vor das % Zeichen eine 3 geschrieben habe sodass er 3 Ziffern einliest.
Nachdem ich die do-while Schleife eingebaut habe funktioniert das leider nicht mehr.
Hier ist mal das Programm für euch.
C:
float groesse;
int gewicht;
int alter;
float bmi;
char geschlecht;
printf("Groesse?\n");
do {
  scanf("% f\n", &groesse);
} while (getchar() != '\n');
printf("Gewicht?\n");
do {
  scanf("% d\n", &gewicht);
} while (getchar() != '\n');
printf("Alter?\n");
do {
  scanf("% d\n", &alter);
} while (getchar() != '\n');
printf("Geschlecht? m oder w\n");
do {
  scanf(" %c", &geschlecht);
} while (getchar() != '\n');
bmi = gewicht / (groesse * groesse);
printf("BMI: %f\n", bmi);
Ich bin für eure Hilfe sehr dankbar.
Liebe Grüße
 
Zuletzt bearbeitet von einem Moderator:
Kompiliert das bei Dir? Ich frage wegen der Leerzeichen in den Formatstrings.

C:
#include <stdio.h>

int main() {
  float groesse;
  int gewicht;
  int alter;
  float bmi;
  char geschlecht;

  printf("Groesse? [Meter]\n");
  scanf("%f", &groesse);
  while (getchar() != '\n')
    ;

  printf("Gewicht? [kg]\n");
  scanf("%d", &gewicht);
  while (getchar() != '\n')
    ;

  printf("Alter? [Jahre]\n");
  scanf("%d", &alter);
  while (getchar() != '\n')
    ;

  printf("Geschlecht? [(]m oder w]\n");
  scanf("%c", &geschlecht);
  while (getchar() != '\n')
    ;

  bmi = gewicht / (groesse * groesse);
  printf("BMI: %f\n", bmi);

  return 0;
}
 
Kompiliert das bei Dir? Ich frage wegen der Leerzeichen in den Formatstrings.

C:
#include <stdio.h>

int main() {
  float groesse;
  int gewicht;
  int alter;
  float bmi;
  char geschlecht;

  printf("Groesse? [Meter]\n");
  scanf("%f", &groesse);
  while (getchar() != '\n')
    ;

  printf("Gewicht? [kg]\n");
  scanf("%d", &gewicht);
  while (getchar() != '\n')
    ;

  printf("Alter? [Jahre]\n");
  scanf("%d", &alter);
  while (getchar() != '\n')
    ;

  printf("Geschlecht? [(]m oder w]\n");
  scanf("%c", &geschlecht);
  while (getchar() != '\n')
    ;

  bmi = gewicht / (groesse * groesse);
  printf("BMI: %f\n", bmi);

  return 0;
}
Danke für deine Antwort.
Ja es kompiliert einwandfrei und funktioniert auch tadellos wenn ich es bei mir ausführe.
Kannst du mir die letzte Zeile mit dem getchar() einmal erklären?
Ich habe jetzt erst bemerkt das ich in dem scanf() das "\n" aus dem printf() reingeschrieben habe. Was für eine doofer Fehler.

Liebe Grüße
 
Zuletzt bearbeitet:
Kannst du mir die letzte Zeile mit dem getchar() einmal erklären?
getchar() wird mindestens einmal aufgerufen. Wenn das gelesene Zeichen ein '\n' ist, war's das auch schon. Aber wenn du bspw. per scanf("%d", ...) ein int einlesen willst und 234xyz eingibst, bleibt "xyz\n" als Rest im stdin stehen. Hier macht dann die while Schleife Sinn, da getchar() solange zeichenweise liest, bis das '\n' erreicht ist.
 
Zurück
Oben Unten