Brauche hilfe bei meinem Parser!



  • Hi,
    Für mein Programm benötige ich für einige meiner Editboxen einen Parser, der fals nötig die vom Benutzer eingegebene Zeile korigiert. Es geht in erste Line darum das der Beutzer in der Edit eine Größer eingeben soll/kann und zwar auch mit Stellen nach den Komma (zB. 1.23 oder 1,23 ). da ich anschließend mit atof arbeite muss ich vorher noch sicher sein das kein ',' sondern ein '.' benutzt wurde, weiter wollte ich noch sicher sein, das alle Buchstaben, wenn vorhanden, einfach ignoriert werden und auch sonstige Zeichen (halt bis auf 0 - 9 ). eigentlich klapt das ja auch schon ganz gut aber - ich lasse ja gleich die korigierte Variante neu ins Edit schreiben - tauchen da noch irgendwelche anderen zeichen hinten dran auf, also zB:

    Benutzereingabe | Korigierte Form
    -----------------+------------------
     1,3             | 1.3                 // funktioniert
     4,2             | 4.2                 // auch kein Problem
     1,23            | 1.230ui             // ab zwei Stellen nach dem Komma gehts nicht mehr
     1,a2            | 1.2                 // geht
     1.a2            | 1.2                 // geht auch
     1,.,.,,.5       | 1.2                 // no prob
     1.,..3gdsdf     | 1.3                 // geht 
     2,.r2fh.        | 2.2                 // geht
     4 ,. 2 a.       | 4.2                 // geht
    

    so und hier mal der Parser:

    void fParseIt( char * szBuffer ) {
    
        char szNewString[ 32 ];
             szNewString[  0 ] = 0;
        int iLength = strlen( szBuffer );
        bool bPaseDot = false;
    
        int c = 0;
        for( int i = 0; i < iLength; i++ ) {
    
            // ***** first dot *****
            if( !( bPaseDot ) && ( ( szBuffer[ i ] == ',' ) || ( szBuffer[ i ] == '.' ) ) ) {
    
                if( szBuffer[ i ] == ',' ) {
    
                    szBuffer[ i ] = '.';
                }
                szNewString[ c ] = szBuffer[ i ];
                c++;
                bPaseDot = true;
                continue;
            }
    
            // ***** any other *****
            if( ( (int)szBuffer[ i ] >= 48 ) && ( (int)szBuffer[ i ] <= 57 ) ) {
    
                szNewString[ c ] = szBuffer[ i ];
                c++;
            }
        }
    
        szBuffer[ 0 ] = 0;
        strcpy( szBuffer, szNewString );
    }
    

    ich hoffe es ist verständlich, wenn nicht einfach fragen. aber irgendwie muss da nen fehler drin sein.
    Hoffe ihr könnt mir da weiter helfen.

    Gruß Tobi.



  • void fParseIt( char * szBuffer ) {
    
        char szNewString[ 32 ];
        int iLength = strlen( szBuffer );
        bool bPaseDot = false;
    
        int c = 0;
        for( int i=0; i<iLength; i++ ) {
            // ***** first dot *****
            if( !bPaseDot && (szBuffer[i]==',' || szBuffer[i]=='.') ) {
                szNewString[c++] = '.';
                bPaseDot = true;
            }
            // ***** any other *****
            else if( szBuffer[i]>='1' && szBuffer[i]<='9' ) {
                szNewString[c++] = szBuffer[ i ];
            }
        }
    
        szNewString[c] = '\0'; //<- hier das entscheidende ;)
        szBuffer[0] = '\0';
        strcpy( szBuffer, szNewString );
    }
    


  • Nimm C++ ... lösche alles was nicht vom Type "0123456789,." ist. Guck ob mehr als ein "," und/oder "." im String sind => Fehlermeldung! (Oder was soll bei "4,2.3" oder "4.3.2" oder "4,2,3" rauskommen :P) Ersetze "," durch ".".



  • @Badestrand Danke, kommisch das ich das vergessen habe -.-. aber du hast auch noch nen kleinen Schönheitsfehler im Programm 😛

    ...
    else if( szBuffer[i]>='1' && szBuffer[i]<='9' ) {
                           ^
                           |
                           muss '0' heißen! :P
    ...
    

    Trotzdem danke,

    Gruß Tobi.



  • Gibt es einen Speziellen Grund dafür, dass du keinen Regulären Ausdruck dafür benutzt?


Anmelden zum Antworten