C++ Wörter auslesen



  • Hallo Zusammen,
    ich suche nun schon seit 2h das ganze Internet durch.
    Ich möchte gerne bei einer C++ Konsolen Anwendung
    es so machen wenn man z.b. help eingibt ein neuer text erscheint!
    also denke ich das man dies mit if mach ,aber wie?
    kann mir jemand helfen?



  • #include <iostream>
    #include <string>
    
    int main()
    {
        std::cout << "Gib' \"help\" ein und drueck' Enter: ";
        std::string input;
        std::cin >> input;
        if (input == "help")
            std::cout << "ein neuer text\n";
    }
    

    und nu?



  • @Swordfish sagte in C++ Wörter auslesen:

    #include <iostream>
    #include <string>
    
    int main()
    {
        std::cout << "Gib' \"help\" ein und drueck' Enter: ";
        std::string input;
        std::cin >> input;
        if (input == "help")
            std::cout << "ein neuer text\n";
    }
    

    und nu?

    Ich würde ja mal behaupten, dass er gerne die Program Args parsen möchte 😃



  • #include <iostream>
    #include <cstring>
     
    int main(int argc, char **argv)
    {
        if (argc == 2 && std::strcmp(argv[1], "help") == 0)
            std::cout << "ein neuer text\n";
    }
    

    und nu?



  • @Swordfish sagte in C++ Wörter auslesen:

    #include <iostream>
    #include <cstring>
     
    int main(int argc, char **argv)
    {
        if (argc == 2 && strcmp(argv[1], "help") == 0)
            std::cout << "ein neuer text\n";
    }
    

    und nu?

    ihgitt 😃 Kein c++17 bei dir verfügbar?
    Dachte eher an sowas hier

    #include <iostream>
    #include <string_view>
     
    int main(int argc, char **argv)
    {
        if (argc == 2 && std::string_view(argv[1]) == "help")
            std::cout << "ein neuer text\n";
    }
    


  • @DNKpp sagte in C++ Wörter auslesen:

    std::string_view(argv[1]) == "help"
    

    und was macht das anders als std::strcmp() außer daß noch ein extra Objekt konstruktioniert werden muss?



  • @Swordfish

    1. Du nutzt kein std::strcmp
    2. ist das immer noch eine c Funktion
    3. Das Konstruieren wird sehr wahrscheinlich keinen Unterschied machen
    4. Willkommen in der Zukunft 😉

    Edit: Es macht wohl einen Unterschied!
    https://godbolt.org/z/nEhra9



  • @DNKpp sagte in C++ Wörter auslesen:

    Edit: Es macht wohl einen Unterschied!

    Wo macht das einen Unterschied?



  • @Mechanics sagte in C++ Wörter auslesen:

    @DNKpp sagte in C++ Wörter auslesen:

    Edit: Es macht wohl einen Unterschied!

    Wo macht das einen Unterschied?

    Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen. Bin jetzt kein wirklicher ASM Experte, vorallem da die Codes string_view zu strcmp ein wenig anders geordnet werden (und ich auch der Colorierung nicht ganz traue) aber es sieht so aus, als sei die string_view Variante mindestens gleich gut, wenn nicht sogar die effizientere. Wie gesagt, naive Sichtweise. Darf mich gerne jemand aufklären.



  • @DNKpp sagte in C++ Wörter auslesen:

    Du nutzt kein std::strcmp
    ist das immer noch eine c Funktion

    troll dich



  • Beide Funktonen springen zu dem gleichen Code. Da ist nur der erste Vergleich vorher.



  • @Mechanics Äh, nein. g++ macht aus der string_view mit operator==-Version einen Integervergleich.

    @DNKpp Steht aber nirgends geschrieben daß ein Compiler das für die strcmp-Version nicht genauso machen dürfte.

    Sinnlose Diskussion.



  • @Swordfish sagte in C++ Wörter auslesen:

    @Mechanics Äh, nein. g++ macht aus der string_view mit operator==-Version einen Integervergleich.

    @DNKpp Steht aber nirgends geschrieben daß ein Compiler das für die strcmp-Version nicht genauso machen dürfte.

    Sinnlose Diskussion.

    Der Einzige, der hier sinnlos diskutiert bist meiner Meinung nach du. Es ist objekte sicherlich auch verständlicher, wenn ein Vergleich statt eines vagen integers (0 == true, yay!) einen bool returned. Du kennst die Funktion, der OT sicherlich nicht. operator == versteht nunmal jeder. Das einzige was hier für dich und strcmp spricht, ist deine Trotzigkeit. C++ hat mittlerweile die Tools um auf diese c Relikte zu verzichten, also sollte man sie auch nutzen. Aber das sollte ich dir eigentlich nicht erzählen müssen.

    Achja, und den Troll darfst du gerne stecken lassen.



  • @DNKpp Whatever.



  • @DNKpp sagte in C++ Wörter auslesen:

    @Mechanics sagte in C++ Wörter auslesen:

    @DNKpp sagte in C++ Wörter auslesen:

    Edit: Es macht wohl einen Unterschied!

    Wo macht das einen Unterschied?

    Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen.

    https://godbolt.org/z/nEhra9

    Wenn ich das richtig sehe, dann macht er in der ASM-Zeile 31 für den string_view noch einen strlen-Aufruf. Das hätte ich erstmal auch nicht so erwartet, aber wenn man drüber nachdenkt macht es Sinn. Der string_view muss schliesslich die Länge des Strings kennen und die muss bei einem blanken C-String natürlich erstmal ermittelt werden - auch wenn das OS die Länge des Arguments kennt, aber sie wird ja leider nicht an die main weitergereicht.

    strcmp braucht die Länge nicht, dass stoppt einfach beim '\0'-Zeichen, wann immer das kommt. Das Konstruieren des string_view wäre eigentlich kein Problem, wenn die Länge bekannt wäre. Dann würde das garantiert zu etwas strcmp-Äquivalentem und sonst nichts weiter optimiert werden (vom strlen-Call abgesehen passiert das hier ja auch).

    Der JMP zu std::__ostream_insert ist übrigens lediglich ein "cout"-Tailcall. Lustig finde ich allerdings die Optimierung mit dem cmp DWORD PTR [rbx], 1886152040 in Zeile 38. 1886152040 = 0x706c6568 = (uint32_t) 'help'. Daher gibts auch keinen strcmp-Loop wie in Zeile 14 mit repz cmpsb. Der Vergleich mit dem ganzen String am Stück in einem 32-Bit Wert dürfte einen winzigen Tick effizenter sein als mit der repz-Schleife Byte für Byte zu vergleichen - leider macht das zusätzliche strlen jeden potentiellen Vorteil dieser hübschen Optimierung wieder kaputt 😉



  • @Finnegan sagte in C++ Wörter auslesen:

    @DNKpp sagte in C++ Wörter auslesen:

    @Mechanics sagte in C++ Wörter auslesen:

    @DNKpp sagte in C++ Wörter auslesen:

    Edit: Es macht wohl einen Unterschied!

    Wo macht das einen Unterschied?

    Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen.

    https://godbolt.org/z/nEhra9

    Wenn ich das richtig sehe, dann macht er in der ASM-Zeile 31 für den string_view noch einen strlen-Aufruf. Das hätte ich erstmal auch nicht so erwartet, aber wenn man drüber nachdenkt macht es Sinn. Der string_view muss schliesslich die Länge des Strings kennen und die muss bei einem blanken C-String natürlich erstmal ermittelt werden - auch wenn das OS die Länge des Arguments kennt, aber sie wird ja leider nicht an die main weitergereicht.

    strcmp braucht die Länge nicht, dass stoppt einfach beim '\0'-Zeichen, wann immer das kommt. Das Konstruieren des string_view wäre eigentlich kein Problem, wenn die Länge bekannt wäre. Dann würde das garantiert zu etwas strcmp-Äquivalentem und sonst nichts weiter optimiert werden (vom strlen-Call abgesehen passiert das hier ja auch).

    Der JMP zu std::__ostream_insert ist übrigens lediglich ein "cout"-Tailcall. Lustig finde ich allerdings die Optimierung mit dem cmp DWORD PTR [rbx], 1886152040 in Zeile 38. 1886152040 = 0x706c6568 = (uint32_t) 'help'. Daher gibts auch keinen strcmp-Loop wie in Zeile 14 mit repz cmpsb. Der Vergleich mit dem ganzen String am Stück in einem 32-Bit Wert dürfte einen winzigen Tick effizenter sein als mit der repz-Schleife Byte für Byte zu vergleichen - leider macht das zusätzliche strlen jeden potentiellen Vorteil dieser hübschen Optimierung wieder kaputt 😉

    Vielen Dank für deine ausführliche Antwort. Das strlen hatte ich tatsächlich auch schon entdeckt, konnte das aber nicht genau zuordnen. Aber macht schon Sinn, was du sagst.
    Festhalten lässt sich dementsprechend, dass ich mich bzgl Performance ein wenig zu weit aus dem Fenster gelehnt habe. Nichts desto trotz stehe ich zu der Meinung, dass man Neulinge nicht mit c Relikten konfrontieren sollte, wenn es andere, Syntaktisch intuitivere, Varianten gibt. Command Line Args parsen wird wohl selten zum Hot-Path des Programms werden und dementsprechend sehe ich da Ausdrucksstärke höher gewichtet als potentiell marginale Performance-Gewinne. Generell könnte man sowas mal profilen.

    Habs jetzt direkt mal versucht. Die Resultate sind weird. Auf clang ist string_view ein Stückchen langsamer, auf gcc allerdings fast 5 mal so schnell wie die strcmp Variante. Ich befürchte allerdings, dass da irgendwas weg-optimiert wird.
    https://quick-bench.com/q/dzcKmfNPhxZmzyr_fDME_W-J6Ag



  • @DNKpp sagte in C++ Wörter auslesen:

    Die Resultate sind weird. Auf clang ist string_view ein Stückchen langsamer, auf gcc allerdings fast 5 mal so schnell wie die strcmp Variante.

    Das kannst gerne im Compiler- und IDE-Forum diskutieren.



  • @Swordfish sagte in C++ Wörter auslesen:

    @Mechanics Äh, nein. g++ macht aus der string_view mit operator==-Version einen Integervergleich.

    facepalm
    Ich konnte gestern L4 und L14 nicht auseinander halten 😞


Log in to reply