Reine Zahleneingaben
-
Um reine Zahleneingaben zu realisieren, bedarf es etwas Geschick um die Regeln für 'richtige' Zahlen in C / C++ einzuhalten. Damit nicht jeder seine eigene Funktionen basteln muss, findet ihr hier eine Funktion ReadDigits() die alle Regeln einhält:
// C-Variante ( Dankeschön an Shade Of Mine! ): #include <ctype.h> #include <stdio.h> #include <string.h> #include <conio.h> char * ReadDigits ( char * ReadAll , size_t maxsize , char TerminatingChar ) { char ReadNow = ''; int isVZ = 0; int isPB = 0; int isEE = 0; int len = 0; ReadAll[0] = 0; while( ( ReadNow = getch() ) && ( ReadNow != TerminatingChar ) && maxsize ) { len = strlen( ReadAll ); --maxsize; if ( ( ( isdigit ( ReadNow ) ) && ( isVZ = 1 ) ) || ( ( ReadNow == '+' || ReadNow == '-' ) && ( isVZ == 0 ) && ( isVZ = 1 ) ) || ( ( ReadNow == '.' || ReadNow == ',' ) && ( isPB == 0 ) && ( isPB = 1 ) ) || ( ( ReadNow == 'E' || ReadNow == 'e' ) && ( isEE == 0 ) && ( isEE = 1 ) ) ) { ReadAll[len] = ReadNow; ReadAll[len + 1] = 0; putchar ( ReadNow ); } else if ( ( ReadNow == '' ) && ( ReadAll[0] != 0 ) ) { ++maxsize; ReadNow = ReadAll [len - 1]; if ( ( ( ReadNow == '+' || ReadNow == '-' ) && ( isVZ = 0 ) ) || ( ( ReadNow == '.' || ReadNow == ',' ) && ( isPB = 0 ) ) || ( ( ReadNow == 'E' || ReadNow == 'e' ) && ( isEE = 0 ) ) || ( ReadNow ) ) { printf ( " " ); } ReadAll[len - 1] = 0; if ( len == 1 ) { isVZ = 0; } } } return ReadAll; } // C++-Variante: #include <iostream> #include <string> #include <cctype> std::string ReadDigits ( const char TerminatingChar = ' ' ) { std::string ReadAll; char ReadNow ( '' ); bool isVZ ( false ); bool isPB ( false ); bool isEE ( false ); while ( ( ReadNow = getch() ) && ( ReadNow != TerminatingChar ) ) { if ( ( ( isdigit ( ReadNow ) ) && ( isVZ = true ) ) || ( ( ReadNow == '+' || ReadNow == '-' ) && ( isVZ == false ) && ( isVZ = true ) ) || ( ( ReadNow == '.' || ReadNow == ',' ) && ( isPB == false ) && ( isPB = true ) ) || ( ( ReadNow == 'E' || ReadNow == 'e' ) && ( isEE == false ) && ( isEE = true ) ) ) { ReadAll += ReadNow; std::cout << ReadNow; } else if ( ( ReadNow == '' ) && ( ReadAll.length() != 0 ) ) { ReadNow = ReadAll [ReadAll.length () - 1]; if ( ( ( ReadNow == '+' || ReadNow == '-' ) && ( isVZ = false ) ) || ( ( ReadNow == '.' || ReadNow == ',' ) && ( isPB = false ) ) || ( ( ReadNow == 'E' || ReadNow == 'e' ) && ( isEE = false ) ) || ( ReadNow ) ) { std::cout << " "; } ReadAll.resize ( ReadAll.length() - 1 ); if ( !ReadAll.length () ) { isVZ = false; } } } return ( ReadAll ); }
Als Parameter übergibt man das terminierende Zeichen, standardmäßig ist es auf die Enter-Taste gesetzt. Als Rückgabewert, bekommt man den gewünschten String mit den Zahlen. Für das konvertieren in einen mathematischen Typ lest bitte in der "ANSI C"-FAQ bzw. in der "C++"-FAQ nach.
MfG SideWinder
PS: Wenn ihr Fehler findet, meldet euch bitte umgehend.
[ Dieser Beitrag wurde am 24.08.2002 um 12:18 Uhr von SideWinder editiert. ]