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 |