Fehleingaben abfangen C/C++

Also ich lern in der Schule gerade C/C++.
Und wir haben noch nichts mit "cout/cin"
Wir haben jetzt ein Projekt und da hab ich folgendes Programm geschreiben:

Code:
#include <conio.h>
#include <stdio.h>

void main()
{
     //---Variablen deklarieren--------------------------------------------------------------------
     float f32Imax, f32Umax, f32Laenge, f32LeitungsWiderstand, f32Leitungsquerschnitt;
     const conSpezLeitwertCU = 56;
     const float conMaxSpannungsabfall = 0.03;
     //--------------------------------------------------------------------------------------------

     //---Eingabe der benötigten Werte-------------------------------------------------------------
     printf("\Programm zur Errechnung des benoetigten Leitungsquerschnittes");
     printf("\n=============================================================");

     printf("\n\n       <Volt> Netzspannungspannung: ");
     scanf("%f", &f32Umax);

     printf("     <Ampere> maximaler Stromfluss: ");
     scanf("%f", &f32Imax);

     printf("      <Meter>          Kabellaenge: ");
     scanf("%f", &f32Laenge);
     //--------------------------------------------------------------------------------------------

     //---Querschnittbestimmung--------------------------------------------------------------------
     if ((f32Imax > 0) && (f32Umax > 0) &&  (f32Laenge>0))
      {

       //---Berechnungen---------------------------------------------------------------------------
       f32LeitungsWiderstand = (conMaxSpannungsabfall * f32Umax) / f32Imax;
       f32Leitungsquerschnitt = (2 * f32Laenge) / (conSpezLeitwertCU * f32LeitungsWiderstand);
       //------------------------------------------------------------------------------------------

       if (f32Leitungsquerschnitt <= 1.5)
        {
         f32Leitungsquerschnitt = 1.5;
        }
       else
        {
         if ((f32Leitungsquerschnitt > 1.5) && (f32Leitungsquerschnitt < 2.5))
          {
           f32Leitungsquerschnitt = 2.5;
         }
         else
          {
           if ((f32Leitungsquerschnitt > 2.5) && (f32Leitungsquerschnitt < 4.0))
            {
            f32Leitungsquerschnitt = 4.0;
            }
           else
            {
             if ((f32Leitungsquerschnitt > 4.0) && (f32Leitungsquerschnitt < 6.0))
              {
              f32Leitungsquerschnitt = 6.0;
              }
             else
              {
               if ((f32Leitungsquerschnitt > 6.0) && (f32Leitungsquerschnitt < 10.0))
                {
                f32Leitungsquerschnitt = 10.0;
                }
               else
                {
                 if ((f32Leitungsquerschnitt > 10.0) && (f32Leitungsquerschnitt < 16.0))
                  {
                  f32Leitungsquerschnitt = 16.0;
                  }
                 else
                  {
                   if ((f32Leitungsquerschnitt > 16.0) && (f32Leitungsquerschnitt < 25.0))
                    {
                    f32Leitungsquerschnitt = 25.0;
                    }
                   else
                    {
                    f32Leitungsquerschnitt = 35.0;
                    }
                  }
                }
              }
            }
          }
        }
      }

     else
      {
       printf("\n   ____________________________________________");
       printf("\n\n                               Falsche Eingabe!");
       printf("\n                               ================");
      }
     //--------------------------------------------------------------------------------------------

     //---Ausgabe des berechneten Querschnittest---------------------------------------------------
     if (f32Leitungsquerschnitt > 0)//---Wurde überhaupt gerechnet?
      {
      if (f32Leitungsquerschnitt < 10)//---Wenn Ergebnis > 10 andere Ausgabeformatierung
       {
        printf("\n   ____________________________________________");
        printf("\n\n   benoetigter Leitunsgquerschnitt: %0.1f mm * mm", f32Leitungsquerschnitt);
        printf("\n                                    ===========");
       }
       else
        {
        printf("\n   _____________________________________________");
        printf("\n\   benoetigter Leitunsgquerschnitt: %0.1f mm * mm", f32Leitungsquerschnitt);
        printf("\n                                    ============");
        }
      }
     //--------------------------------------------------------------------------------------------

     //---Ende-------------------------------------------------------------------------------------
     printf("\n\n\n\n   [Taste zum Beenden druecken]");
     printf("\n   ----------------------------");
     getch();
     //--------------------------------------------------------------------------------------------
}

Das Problem ist, wie kann ich die Fehleingaben anfangen. Wenn z.b. bei Spannung ein Buchstabe eingegeben wird soll das Programm s9olang nochmal nachfragen bis man eine Zehl (numerischen Wert) eingibt.
Auf nem anderen Board hat jemand zu mir gesagt das es so geht:

Code:
        printf("\n\n       <Volt> Netzspannungspannung: ");
        while(!scanf("%f", &f32Umax))
         printf("Die Spannung muß eine Gleitkommazahl sein!\n");


        printf("     <Ampere> maximaler Stromfluss: ");
        while(!scanf("%f", &f32Imax))
         printf("Die Stromstärke muß eine Gleitkommazahl sein!\n");

        printf("      <Meter>          Kabellaenge: ");
        while(!scanf("%f", &f32Laenge))
         printf("Die Kabellänge muß eine Gleitkommazahl sein!\n");

Nur irgendwie will das net gehn weil mein Programm dann immer in eine Endlosschleife kommt. Kann mir bitte jemand helfen? Wäre sehr nett, Danke!
 
die endlosschleife kannst du verhindern indem du nach jedem scanf den eingabepuffer leerst.
Code:
fflush(stdin);
falls dein compiler damit nicht klar kommt, schau mal hier.
 
@ivegotmail: wieso gibts du eigentlich einen tip, der falsch ist und verlinkst aber gleichzeitig auf eine seite, auf der erklärt wird, warum das so ist und wie man es besser macht?
 
jeder kann selber entscheiden, wie wichtig es bei seinem projekt ist nach dem standard zu proggen und ob er fflush auf eingabekanäle nutzt oder nicht (sofern die funktion denn implementiert ist).

wenn ich mir zB mal eben nen 20 zeiler progge der mir kurz die arbeit erleichtern soll, dann werde ich fflush auf eingabekanäle nicht nochmal selber implementieren, nur weil die funktion die u.U. schon dabei ist, nicht im C/C++ standard definiert ist.

wie gesagt, kann ja jeder nach lust & laune und der situation entsprechernd selber entscheiden.
 
ok, nur um mal kurz was zu testen sehe ich da auch kein problem.
aber sowas als ratschlag zu geben ist meiner meinung nach schon problematischer. es ist schlichtweg falsch und wenn so etwas dann mal in einem größeren projekt landet, dann kann das zu erheblichen problemen führen, verbunden mit langwieriger, nervenaufreibender und womöglich noch richtig teurer fehlersuche.
bei einem vielleicht auch nur mittlegroßem projekt den standard trotz besseren wissens nur aus "faulheit" zu missachten ist meiner meinung nach allerdings völlig schwachsinnig. wenn es schon den standard gibt, wieso ihn dann nicht nutzen? schließlich erleichtert er die arbeit nicht gerade wenig...
 
Zurück
Oben