Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Eingabefunktion mit Prüfung auf Ziffern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.05.2005, 23:49 Uhr
Jetro



Hallo,

ich hab ein kleines Problem, welches sich sicher lösen lässt Ich bekomm es nur nicht hin .

Also ich möchte eine Eingabefunktion schreiben, die prüft ob die Eingabe in der Konsole eine Zahl kleiner 100.000.000 ist.

Also:

1. Die Eingabe darf nur aus Ziffern bestehen
2. Die daraus resultierende Zahl muss kleiner 100.000.000 sein.

Mein erster Versuch dies zu realisieren sah so aus:


Code:
void eingabe()
{
    iEingabeZahl = -1;           //Eingabezahl zurücksetzen
    
    while ((iEingabeZahl > 100000000) || (iEingabeZahl<1))      //solange wie die Zahl in den Grenzen
    {  
        cZeichen = 0;                       //Das Eingabezeichen zurücksetzen
        strcpy(cEingabestring, buffer);     //Den Eingabestring zurücksetzen
        iZeichenzahl = 0;                   //bisher 0 Zeichen getippt

        system("cls");                      //Bildschirm löschen
        menue();                            //Menue zeichnen (soll ja schön aussehen) ;)

        if ((iEingabeZahl > 100000000))
          printf("%d ist zu gross...\n", iEingabeZahl);
        if (iEingabeZahl == 0)
          printf("%d ist zu klein...\n", iEingabeZahl);
        
        printf("Geben Sie eine Zahl zwischen 1 und 100.000.000 ein!\n");

        while ((cZeichen != 13))                  //solange wie nicht ENTER gedrückt wird
        {
            cZeichen = getch();                   //Ein Zeichen einlesen
            
            if ((iZeichenzahl < 9) &&             //Prüfung ob schon mehr als 9 Zeichen getippt
                (cZeichen>=48) && (cZeichen <= 57))           //Prüfung ob Zeichen eine Ziffer (ASCII)
              {
                    printf("%c", cZeichen);                   //Das Zeichen ausgeben (das der Benutzer auch sieht was er tippt)
                    strcat(cEingabestring, &cZeichen);         //Das Zeichen an den String anhängen
                    iZeichenzahl++;                           //Anzahl Zeichen erhöhen
                    iEingabeZahl = atoi(cEingabestring);       //den String in einen integer Wert wandeln
               }              
        }
    }
    printf("\n");
}


Funktioniert auch wunderbar. Das Problem ist nur, das ich nun bei der Eingabe nicht mehr Backspace drücken kann. Also wenn ich mich vertippe kann ich das Zeichen nicht mehr löschen.

Daher meine 1. Frage: Wie kann ich in der Konsole das letzte Zeichen löschen oder evtl eine Zeile löschen. Oder wie bekomm ich es hin, das ich Backspace verwenden kann.

Nun habe ich versucht noch eine zweite Lösung zu basteln:


Code:
void eingabe()
{

  do
  {
    iEingabeZahl = -1;           //Eingabezahl zurücksetzen

    clrscr();                           //Bildschirm löschen
    menue();                            //Menue zeichnen (soll ja schön aussehen) ;)

    bFehler = false;

    //Eingabestring komplett löschen
    for(int i = 0; i<=100; i++)
      {
        cEingabestring[i] = '\0';
      }

    printf("Geben Sie eine Zahl zwischen 1 und 100.000.000 ein!\n");
    fflush(stdin);
    scanf("%9s", &cEingabestring);


    //Prüfung ob die eingabe nur aus Zahlen besteht
    for(int i = 0; i<=100; i++)
    {
      if(cEingabestring[i]==32) printf("LEERTASTE DRIN");
      if (!(isdigit(cEingabestring[i])) &&
         (cEingabestring[i] != '\0'))
        {
          bFehler = true;
        }
    }

    //Zahl umwandeln
    if (bFehler)
      {
        printf("\nDie Eingabe darf nur aus Zahlen bestehen, bitte erneut eingeben!\n");
        printf("...weiter mit beliebiger Taste...");
        getch();
      }
    else
      {
        iEingabeZahl = atoi(cEingabestring);

        //Prüfung ob zu groß oder zu klein
        if ((iEingabeZahl > 100000000) || (iEingabeZahl<1))
        {
          bFehler = true;
          printf("\nDiese Zahl liegt nicht in den Grenzen zwischen 1 und 100.000.000!\n");
          printf("...weiter mit beliebiger Taste...");
          getch();
        }
    }
} while (bFehler == true);

}


Funktioniert auch wieder wunderbar bis auf das, das wenn z.B. "12234 asd" eingegeben wird irgendwie das "asd" abgeschnitten wird und nicht geprüft wird. Es wird also nur die Zahl 12234 umgewandelt. Aber im Grunde ist es ja ein Fehler.

Außerdem scheint
Code:
      if(cEingabestring[i]==32) printf("LEERTASTE DRIN");
nicht zu funktionieren. Warum? Liest scanf() keine Leerzeichen? Oder was macht scanf() wenn ein Leerzeichen auftritt?

Und nun meine letzte Frage: Gibt es dafür einen funktionierenden Algorithmus mit dem das geht

Ich würde mich über Hilfe sehr freuen.

Gruß,
Jetro
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.05.2005, 23:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


eine kleine Anmerkung... ein integraler datentyp von 32 bit kann 100 Millionen nicht darstellen (zumindest nicht wenn er zahlen in einerschritten von 0 an repräsentiert)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.05.2005, 00:07 Uhr
Jetro



Hmm, in meinem Programm passts aber...gibt keine komischen Werte oder so. Steh grad voll auf dem Schlauch Warum geht das nicht? 2^32 ist doch 4294967296, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.05.2005, 00:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Jetro
Jo entschuldige bitte. War wohl die Uhrzeit die mich eine Millarde nicht mehr von ner Million unterscheiden lies... Ich hatte wegen so nem blöden Bitmap noch was mit 2^24 im Kopf was kleiner als 100 Millionen ist
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.05.2005, 10:38 Uhr
Jetro



Kein Problem. Sowas passiert

Trotzdem brauch ich immer noch Hilfe @alle Anderen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.05.2005, 12:02 Uhr
ao

(Operator)


Ich würde den String einlesen mit fgets, als Quelle stdin angeben.
Und die Zahl extrahieren mit strtod, die Funktion zeigt dir gleichzeitig an, ob der ganze String konvertiert werden konnte oder ob ungültige Zeichen drin waren.
Also, lies nach unter fgets und strtod, da sollte beschrieben sein, wie es geht.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.05.2005, 19:18 Uhr
Jetro



Danke für den Tipp. Werde ihn mal ausprobieren und dann hier schreiben ob's geklappt hat

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.05.2005, 00:34 Uhr
Jetro



Hi nochmal.

vielen Dank für den Tipp mit dem fgets()...hab jetzt einfach mein scanf() aus meinem zweiten Versuch damit ersetzt und jetzt funktioniert es wunderbar!

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.06.2005, 02:22 Uhr
Jetro



Der Vollständigkeit halber:

Hab noch etwas rumgespielt und jetzt kann man nur noch Ziffern eingeben, maximal 9 Zeichen und die Backspace Taste funktioniert auch


Code:
void eingabe()
{
    iEingabeZahl = -1;           //Eingabezahl zurücksetzen

    do
    {  
        bFehler = false;
        cZeichen = 0;                       //Das Eingabezeichen zurücksetzen
        strcpy(cEingabestring, "\0");       //Den Eingabestring zurücksetzen
        iZeichenzahl = 0;                   //bisher 0 Zeichen getippt

        system("cls");                      //Bildschirm löschen
        menue();                            //Menue zeichnen (soll ja schön aussehen) ;)

        printf("Geben Sie eine Zahl zwischen 1 und 100.000.000 ein!\n");
        
        while ((cZeichen != 13))                  //solange wie nicht ENTER gedrückt wird
        {
            cZeichen = getch();                   //Ein Zeichen einlesen
            
            if ((iZeichenzahl < 9) &&             //Prüfung ob schon mehr als 9 Zeichen getippt
                (((cZeichen>=48) && (cZeichen <= 57)) || (cZeichen == 8)))           //Prüfung ob Zeichen eine Ziffer (ASCII)
               {
                    if ((cZeichen == 8) && (iZeichenzahl > 0))
                      {
                        cEingabestring[iZeichenzahl-1] = '\0';
                        iZeichenzahl--;
                        printf("\r                   ");
                        printf("\r%s",cEingabestring);
                      }
                    else
                      {                      
                        strcat(cEingabestring, &cZeichen);         //Das Zeichen an den String anhängen
                        printf("\r%s",cEingabestring);
                        iZeichenzahl++;                           //Anzahl Zeichen erhöhen
                      }
               }
        iEingabeZahl = atoi(cEingabestring);       //den String in einen integer Wert wandeln          
        }
        if ((iEingabeZahl > 100000000))
        {
          printf("\n\n%d ist zu gross...\n", iEingabeZahl);
          printf("...weiter mit beliebiger Taste.");
          getch();
          bFehler = true;
        }
      
        if (iEingabeZahl == 0)
        {
            
          printf("\n\nEntweder Sie haben 0 oder gar nix eingegeben (und 0 waere zu klein :))\n", iEingabeZahl);
          printf("...weiter mit beliebiger Taste...");
          getch();
          bFehler = true;
        }
        
    } while (bFehler == true);
    printf("\n");
}


Gruß, Jetro
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.06.2005, 02:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Anmerkung:
(cZeichen>=48) && (cZeichen <= 57) kannst du mit isdigit leichter haben...
13 ist zum einen meist CR. unter Linux wirst du nur ein LF bekommen... deshalb ist es vermutlich schlauer LF (also \n) abzufragen. auch ist es ungünstig direkt den ascii code zu verwenden. auf einer anderen maschine könnten die direkten zahlen anders interpretiert sein...

an sonsten ist das einzelen einlesen ein wenig kompliziert... einfacher ist wenn du wie ao vorgeschlagen hat verfährst... kannst dir einfach eine funktion schreiben die testet ob der string nur aus ziffern besteht (also isdigit für jedes char checken) und wenn der buffer nachdem du 9 zeichen eingelesen hast nicht leer ist weisst du auch das was schief gelaufen ist...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: