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. ]


Anmelden zum Antworten