Integer aus String extrahieren



  • Ich lese folgenden String aus einer Datei ein

    o23454

    Kann die Zahl 23454 aus dem String extrahiert werden und als Integer gespeichert werden????
    lg



  • StrToInt oda so XD



  • bzw.(StringToInteger)





  • std::string s = "Hello World";
    //Array initialisieren, mit sovielPlatz wie s (Weiß noch nicht wie das gehen soll, bin noch nicht so weit :D:D)
    for(int i = 0; i < s.length(); i++)
    {
       switch (s[i])
       {
       case 0;
          //hier dann die Zahl zum Array hinzufügen. das machste dann für jeden Case, wenn es ne zahl ist
         break;
       }
    }
    

    damit kannst du eigentlich jedes zeichen deines Strings darauf überprüfen ob es eine Zahl ist.



  • Du meinst sicherlich

    case '0';
    

    Das eine ziemlich umständliche Methode.


  • Mod

    Kanikkl schrieb:

    ...

    Das kann man aber noch wesentlich hübscher machen, ohne Arrays (sind wir hier in C?) oder cases (ich tipp doch nicht 10 cases, wozu hat man denn eine abstrakte Hochsprache?). Unter der Annahme, dass die erste zusammenhängende Zahl gesucht ist:

    int getnumber(const std::string& input) 
    {
      std::stringstream parser;
      parser<<input;
      int value;
      while(!(parser>>value))
        {
          if (parser.eof()) throw std::invalid_argument("Argument does not contain any digits");
          parser.clear();
          parser.ignore(1);
        }
      return value;
    }
    


  • Apropos abstrakte Hochsprache:

    #include <iostream>
    
    #include <boost/xpressive/xpressive.hpp>
    #include <boost/xpressive/regex_actions.hpp>
    
    int main() {
      using namespace boost::xpressive;
    
      int val;
      sregex const re = *~_d >> (+_d) [ ref(val) = as<int>(_) ];
    
      std::string s = "o12345";
    
      if(regex_match(s, re)) {
        std::cout << "Wert: " << val << std::endl;
      }
    }
    

    😃



  • Irgendwie sagt mir sowas mehr zu: (Python)

    import re
    re.search('([1-9]+)', 'o12345').group(0)
    


  • Irgendwie find ich folgendes noch besser (Perl):

    while (<FILE>) {
      print $1 if /(\d+)/
    }
    

    In C ist das ganze auch nicht so umständlich wie in C++.

    int readnumber(const char *s, int *value)
    {
      for (; *s; ++s)
        if (isdigit(*s))
          return sscanf(s, "%i", value) - 1;
      return -1;
    }
    


  • nonzehpp schrieb:

    In C ist das ganze auch nicht so umständlich wie in C++.

    ich weiß nicht, was daran ..

    ifstream datei("Datei.txt");
        int i;
        datei.ignore(1) >> i;
    

    .. umständlich sein soll.

    Er sagte doch explicit

    webde schrieb:

    Ich lese folgenden String aus einer Datei ein

    o23454

    umständlich ist es, zuerst eine String zu lesen, und anschließend zu versuchen, daraus einen Integer zu extrahieren.

    :xmas2: Werner



  • SeppJ: Ich habs jetzt versucht zu implementieren wie du vorgeschlagen hast.

    SeppJ schrieb:

    int getnumber(const std::string& input) 
    {
      std::stringstream parser;
      parser<<input;
      int value;
      while(!(parser>>value))
        {
          if (parser.eof()) throw std::invalid_argument("Argument does not contain any digits");
          parser.clear();
          parser.ignore(1);
        }
      return value;
    }
    

    Leider funktioniert es noch nicht. Was bedeutet der Ausdruck in der while-Bedingung. Und wieso verwendest du die Funktion clear??


  • Mod

    Was meinst du mit "funktioniert nicht"? Drücke dich klar aus! Die Funktion macht das was ich verstanden habe was du willst.

    Die Lesetechnik die ich da benutze ist wichtige Grundlage beim Benutzen von Streams:

    Der Ausdruck innerhalb der Klammer:
    parser>>value
    Gucken wir in der Referenz:
    http://www.cplusplus.com/reference/iostream/istream/operator>>/
    Die wichtigen Stellen sind:

    These read characters from the input data, and parse them to interpret them as a value of the specific type of its parameter. The resulting value is stored in the variable passed as parameter.
    ...
    Return Value
    The object itself (*this).
    ...
    Errors are signaled by modifying the internal state flags:
    failbit: The input obtained could not be interpreted as an element of the appropriate type.

    Es wird also versucht eine Ganzzahl im Stream zu lesen, schlägt dies fehl, wird das failbit des Streams gesetzt. Der Rückgabewert des Ausdrucks ist der Stream selbst, der im nächsten Schritt ausgewertet wird:

    Der komplette Ausdruck in der while-Schleife:
    !(parser>>value)
    Wieder die Referenz:
    http://www.cplusplus.com/reference/iostream/ios/operatornot/

    Returns true if either one of the error flags (failbit or badbit) is set on the stream. Otherwise it returns false.

    Es wird also festgestellt, ob das parser>>value geklappt hat oder nicht. Wenn es geklappt hat, haben wir unsere Zahl, wenn es nicht geklappt hat, war an der Stelle wohl keine Zahl und der Inhalt der while-Schleife wird ausgeführt, wo der Stream um ein Zeichen weitergesetzt wird.
    (Man braucht den Operator ! übrigens nicht explizit aufzurufen, üblicherweise liest man schließlich bis das Lesen fehlschlägt (Dateiende!) und nicht wie hier bis das Lesen nicht fehlschlägt)

    Warum ich clear benutze:
    Da die letzte Leseaktion fehlgeschlagen ist, wurde das failbit gesetzt. Solange der Stream im Fehlerzustand bleibt, schlagen weitere Leseoperationen automatisch fehl.


Anmelden zum Antworten