PLZ aus String mit string.find()



  • muss da unten nicht

    Address ad = getAddress(...)

    anstatt

    Address a = getAdress(..)

    stehen?



  • Kalif schrieb:

    Dies sollte allgemeingültig sein und nicht nur passend für das genannte Beispiel.

    geht nicht. Du musst schon wissen, in welchen möglichen Formaten die Eingabedaten vorliegen.

    Höchstwahrscheinlich musst du da mit einem regulären Ausdruck ran, da solltest du dir mal boost::regex ansehen. Wenn vor und nach der (fünfstelligen, nummerischen) Postleitzahl immer ein Leerzeichen steht, hast du schonmal gute Chancen, diese rauszufiltern.



  • und wie kann ich nach deiner Lösung nun die PLZ ausgeben?



  • Kalif schrieb:

    muss da unten nicht

    Address ad = getAddress(...)

    anstatt

    Address a = getAdress(..)

    stehen?

    ja, müsste es. das ist ein - in diesem Kontext - völlig irrelevanter Tippfehler. Deswegen stand da ja auch "ungetestet" was soviel heißt wie "ich habe es nicht kompiliert, aber vom Prinzip sollte es so funktionieren".



  • Ja, davor und danach stehen im Leerzeichen

    was kann ich mit boost::regex machen?



  • Kalif schrieb:

    was kann ich mit boost::regex machen?

    strings mit Hilfe regulärer Ausdrücke auseinandernehmen. Wenn du C++11 benutzen kannst, geht das sogar ohne boost:

    #include <regex>
    #include <iostream>
    
    int main()
    {
        const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
        std::regex rgx(".*FILE_(\\w+)_EVENT\\.DAT.*");
        std::smatch match;
    
        if (std::regex_search(s.begin(), s.end(), match, rgx))
            std::cout << "match: " << match[1] << '\n';
    }
    


  • edit: sorry, "zitieren" statt "editieren" geklickt. Ist wohl doch noch zu früh...



  • sorry, aber ich verstehe gar nicht was da steht



  • Kalif schrieb:

    sorry, aber ich verstehe gar nicht was da steht

    dann schau dir erstmal reguläre Ausdrücke an.



  • #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    struct Address
    {
    	std::string street;
    	unsigned int number;
    	std::string city;
    	int postalcode; // vllt besser string oder sowas
    };
    
    Address getAdress(std::string const& line)
    {
    	std::stringstream ss;
    	ss << line;
    
    	Address ad;
    
    	ss >> ad.street >> ad.number >> ad.postalcode >> ad.city;
    
    	return ad;
    }
    
    int main()
    {
    	Address a = getAddress(" Lobdengaustraße 13    69493 Hirschberg  ");
    	cout << a.postalcode;
    	return 0;
    }
    

    Wo liegts Problem?

    daddy_felix schrieb:

    int main()
    {
        const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
        std::regex rgx(".*FILE_(\\w+)_EVENT\\.DAT.*");
        std::smatch match;
    
        if (std::regex_search(s.begin(), s.end(), match, rgx))
            std::cout << "match: " << match[1] << '\n';
    }
    

    🙄



  • Also:

    Erstens:

    daddy_felix schrieb:

    Kalif schrieb:

    muss da unten nicht

    Address ad = getAddress(...)

    anstatt

    Address a = getAdress(..)

    stehen?

    ja, müsste es. das ist ein - in diesem Kontext - völlig irrelevanter Tippfehler. Deswegen stand da ja auch "ungetestet" was soviel heißt wie "ich habe es nicht kompiliert, aber vom Prinzip sollte es so funktionieren".

    Nein muss es nicht. Es wird eine lokale Variable per Kopie zurückgegeben, der Name der neuen Variable ist vollkommen irrelevant, unvorhersehbar und letztlich auch nichtmals nötig (Temporärer Wert, RValue...)
    Das müsstest du als professioneller Software-Entwickler eigentlich wissen, felix ;). Aber egal, passt alles...

    Zweitens:

    Kalif schrieb:

    und wie kann ich nach deiner Lösung nun die PLZ ausgeben?

    Alleine diese Antwor bzw Frage besagt doch schon, dass Khalif keinerlei Ahnung vom Programmieren bzw C++ hat. Was du jetzt nämlich nur noch brauchst, ist der Memberzugriff über das Address-struct-Objekt auf die PLZ.

    std::string plz = boost::lexical_cast<std::string>(a.postalcode);
    

    Da haste aus nem int auch den String...

    Damit komme ich zu Drittens:
    Die Lösung die daddy_felix gepostet hat, zeigt nur die Vorgehensweise der Regex (wobei ich ehrlich zugeben muss, dass ich Regex nicht kann) und ist keine Lösung für dieses Beispiel.

    Mein Tipp (und wahrscheinlich auch der Tipp von vielen anderne hier im Forum): Nimm dir ein gutes Buch und lern C++, wenn dir was dran liegt



  • Tut mir Leid Jungs, dass ich hier vllt zur Belustigung beitrage, aber ich bin eigentlich gar kein Programmierer. Ich hab C++ mal in der Schule gelernt, aber nicht wirklich tiefgründig.
    Und nun musste ich im Praktikum gleich was programmieren, obwohl ich ausdrücklich meinte, dass mir das nicht liegt. Also Augen zu und durch.
    Ich bin eigentlich eher Wirtschaftsinformatiker.

    Trotzdem danke für eure Hilfe und Geduld ^^, ich habe es hinbekommen!



  • Wirtschaftsinformatiker ?

    ...lernt man im Wirtschaftsinformatik Studium von beiden Bereichen gerade so viel, dass man weder mit dem Computer, noch mit dem "Abacus" umgehen kann. 😉 ...

    Aber was ist denn ein "Eher Wirtschaftsinformatiker" ? 😃



  • out schrieb:

    Wo liegts Problem?

    1. kompiliert nicht
    2. Dass der Eingabestring wohl auch mal komplett anders aussehen kann. Oder auch nur ien bisschen - wie genau, hat Kalif ja leider nicht verraten. Aber die folgenden Strings funktionieren shconmal nicht:

    " Lobdengaustraße 13a 69493 Hirschberg "
    " Roter Weg 13 69493 Hirschberg "

    out schrieb:

    daddy_felix schrieb:

    int main()
    {
        const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
        std::regex rgx(".*FILE_(\\w+)_EVENT\\.DAT.*");
        std::smatch match;
    
        if (std::regex_search(s.begin(), s.end(), match, rgx))
            std::cout << "match: " << match[1] << '\n';
    }
    

    🙄

    was ist denn damit? Zugegeben, ich habe den Schnipsel aus dem Netz kopiert und da ich (noch) nicht mit C++11 arbeiten kann, kann ich die Qualität auch nciht beurteilen. Aber auf den ersten Blick sah es jetzt nicht soo schlecht aus...

    Skym0sh0 schrieb:

    Nein muss es nicht. Es wird eine lokale Variable per Kopie zurückgegeben, der Name der neuen Variable ist vollkommen irrelevant, unvorhersehbar und letztlich auch nichtmals nötig (Temporärer Wert, RValue...)
    Das müsstest du als professioneller Software-Entwickler eigentlich wissen, felix ;). Aber egal, passt alles...

    als professioneller Softwareentwickler weiß ich, dass man eine Funktion mit dem Namen "getAdress" nicht aufrufen kann, indem man "getAddress" tippt 😉



  • Wie gesagt, ungetestet im Notepad runtergetippt, sämtliche Includes und namespaces weggelassen. Ist halt nervig, dass die doofen Engländer Address nicht wie im Deutschen mit einem D schreiben.

    They do not want the D. 😉 *if you know what i mean*


Anmelden zum Antworten