Teilstring in Integer umwandeln



  • Hallo,

    ich habe einen C String und zugehörigen Pointer:

    char eingabe[5000];
    char* pEingabe = eingabe;
    

    Jetzt ist dieser String wild vollgestopft mir allen möglichen Zeichen. Zahlen, Buchstaben, Operatoren, etc.
    Ich würde jetzt gerne alle Zahlen dieses C Strings rauspicken und als Integer speichern, wobei mehrere Zahlen hintereinander (1, 2, 3 zBsp) als ein Integer der Größe 123 gespeichert werden sollen.
    Ich hab mir jetzt händisch selber was gebastelt was dies bewerkstelligt, nicht erschrecken, bin erst seit 3Wochen dabei 🙂

    int result;
    int numberArr[100];
    int* pNumberArr = numberArr;
    while(*pEingabe != 0){
       int numbers = 0;
       while(isdigit(*pEingabe)){
          numbers++;
          pEingabe++;
       }
       if(numbers > 0){
          char* tmp = new char[numbers];
          pEingabe = pEingabe - numbers;
          for(int i = 0; i < numbers; i++){
             *tmp = *pEingabe;
             tmp++;
             pEingabe++;
          }
          tmp = tmp - numbers;
          *pNumberArr = atoi(tmp);
          pNumberArr++;
          delete tmp;
       }
       pEingabe++;
    }
    

    Ich laufe quasi das 5000er Array durch und sobald ich auf eine Zahl treffe zähle ich alle folgenden, lege diese in einem temporären, variablen C String ab auf dem ich dann atoi machen kann und speichere den Integer in einem Int-Array. Funktioniert im Grunde einwandfrei, sogar bei Zahlen mit führenden Nullen werden diese nicht angezeigt am Ende. Kann sein das es leichter geht, aber bin wie gesagt noch nicht lange dabei...

    Nur wenn der große 5000er C String als allerletztes eine Zahl (beliebiger Größe) hat, crasht mir das ganze Programm mit dieser Meldung:

    "Debug Assertion Failed"
    Expression: (unsigned)(c + 1) <= 256

    Damit kann ich nicht so Recht was anfangen. Dachte zuerst an Arraygrenzen, aber die hab ich schon mehrfach kontrolliert. Es sind auch keine Zahlen vorhanden die den Integer sprengen würden (max 4 Stellen).

    Kann mit der Meldung jmd etwas anfangen und mir helfen ? 😞



  • Hilfe mein Hirn glüht.
    Erstmal ordentlich formatieren:

    int result;
    int numberArr[100];
    int* pNumberArr = numberArr;
    
    while(*pEingabe)
    {
       int numbers = 0;
    
       while(isdigit(*pEingabe))
       {
          ++numbers;
          ++pEingabe;
       }
    
       if(numbers > 0)
       {
          char* tmp = new char[numbers];
    
          pEingabe = pEingabe - numbers;
    
          for(int i = 0; i < numbers; ++i)
    	  {
             *tmp = *pEingabe;
    
             ++tmp;
             ++pEingabe;
          }
    
          tmp = tmp - numbers;
    
          *pNumberArr = atoi(tmp);
          ++pNumberArr;
    
          delete tmp;
       }
    
       pEingabe++;
    }
    


  • Hihi,

    so mags jeder anders, mich stören zuviele Leerzeilen nur 🙂


  • Mod

    Vorschlag: Mach dir das Leben nicht so schwer, sondern lass die Standardbibliothek die Arbeit machen:

    #include <vector>
    #include <iostream>
    #include <sstream>
    
    using namespace std;
    
    vector<int> extract_integers(const char* input)
    {
      // Erstmal den C-String in etwas brauchbares umwandeln, zum Beispiel einen istream:
      istringstream parser(input);
    
      vector<int> results;
      while (parser.rdbuf()->in_avail())  // So lange noch Zeichen da sind
        {
          int number;
          if (parser >> number)           // Versuche einen int zu lesen
            results.push_back(number);    // Falls erfolgreich -> Wert abspeichern
          else
            {
              parser.clear();             // Andernfalls ein Zeichen überspringen
              parser.ignore(1);
            }
        }
    
      return results;
    }
    
    int main()
    {
      const char eingabe[] = "fd,mn4kj3 lkmro98fjf90vcj#p4eoirnjnc k3908 uj439fj  943n fifdh9 8943h+ 9i4n oi43 98$049uj tjgojrgo0ir3304(-j4 o4 ";  // Beispieleingabe
    
      vector<int> zahlen = extract_integers(eingabe);  // Zahlen extrahieren
    
      for(unsigned i = 0; i < zahlen.size(); ++i) cout << zahlen[i] << endl; // Beispielausgabe
    }
    

    Ausgabe des Beispiels in main():

    4
    3
    98
    90
    4
    3908
    439
    943
    9
    8943
    9
    4
    43
    98
    49
    0
    3304
    4
    4
    


  • SeppJ schrieb:

    const char eingabe[] = "fd,mn4kj3 lkmro98fjf90vcj#p4eoirnjnc k3908 uj439fj  943n fifdh9 8943h+ 9i4n oi43 98$049uj tjgojrgo0ir3304(-j4 o4 ";
    

    Da hast du aber gut auf der Tastatur rumgehämmert 😃 👍


  • Mod

    FreakY<3Cpp schrieb:

    SeppJ schrieb:

    const char eingabe[] = "fd,mn4kj3 lkmro98fjf90vcj#p4eoirnjnc k3908 uj439fj  943n fifdh9 8943h+ 9i4n oi43 98$049uj tjgojrgo0ir3304(-j4 o4 ";
    

    Da hast du aber gut auf der Tastatur rumgehämmert 😃 👍

    Ehrlich gesagt habe ich hinterher noch manuell ein paar Sonderzeichen eingefügt, weil mir das Ergebnis des Hämmerns nicht "zufällig" genug war (nur Buchstaben und Zahlen aus der Mitte der Tastatur getroffen) 😃 .



  • Hallo und Guten Morgen,

    vielen Dank SeppJ, irgendwie hat ich ja die ganze Zeit beim basteln das Gefühl das es sicher auch leichter geht, jetzt weiß ich wie 🙂

    Aber als Nachtrag kann ich auch noch sagen das ich rausgefunden habe wieso es bei meinem gebastelten angestürzt ist, gestern Nacht um halb 1 (jaja, es hat mir keine Ruhe gelassen ^^) bin ich dahintergekommen.
    Wenn eine Zahl erkannt wurde, wird das nächste Zeichen im großen C String übersprungen (weil ja ganz am Ende nochmal pEingabe++; kommt). Das funktioniert solange gut bis das letzte Zeichen im String eine Zahl ist, dann überspringt er nämlich die NullTerminierung, daraufhin bekommt die isdigit() Methode irgendwelche kryptischen Zeichen irgendwo aus dem Speicher und das gefällt ihr wohl gar nicht.
    Einfach am Ende der Erkennung eines Integers noch ein pEingabe-- und dann hat es auch funktioniert.

    Hab trotzdem deine Lösung übernommen, erscheint mir wesentlich übersichtlicher und vorallem verständlicher, danke nochmal 🙂


Anmelden zum Antworten