if (char == ?



  • TravisG schrieb:

    #include <string>
    
    int main()
    {
    char a[]="hallo";
    char b[]="hallo";
    if(std::strcmp(a,b)==0) //liefter 0 zurück wenn beide strings gleich
    {
        //...
    }
    return 0;
    }
    

    ich hab das programm nicht kompiliert, es ist sicher richtig aber ich bin mir nicht 100% sicher ob strcmp im namespace std ist, sollte aber eigentlich schon dort sein.

    Das ist das C++ Forum. Hier wird String verwendet. strcmp ist C. Daher ist strcmp auch nicht im Namespace std enthalten.


  • Mod

    ... schrieb:

    Das ist das C++ Forum. Hier wird String verwendet. strcmp ist C. Daher ist strcmp auch nicht im Namespace std enthalten.

    selbstverständlich befindet sich strcmp im namespace std. der korrekte header dafür ist allerdings <cstring>



  • mein fehler, sorry



  • ok dann <cstring>



  • char - ly schrieb:

    Hallo,

    ich habe ein Frage.
    Und zwar habe ich eine Variable

    char mode [255];
    char id [255];
    

    Jetzt will ich mit Hilfe einer if Schleife andere Werte zuweisen. Also so:

    if (mode == "eins")
          int Mode = 1;
    else  int Mode = 0;
    

    genauso mit der ID.

    Aber irgendwie kriegt er den Vergleich nicht auf die Reihe....

    Ne Idee??

    Erstmal solltest du keine char arrays verwenden. Wenn du C++ nutzt, stellt die stl schon diverse Klassen zum Stringhandling bereit.

    #include <string>
    
    // ...
    
    std::string mode( "deinwert" );
    std::string id( "deinwert" );
    
    if ( mode == "eins" )
    {
      // ...
    }
    else
    {
      // ...
    }
    

    Außerdem solltest du int Mode nicht innerhalb deines if/else Blocks deklarieren. Da diese außerhalb desselben nicht sichtbar ist.
    Desweiteren musst du dir überlegen ob du nicht bessere Bezeichnungen für deine Variablen verwenden willst. Du verwendest mode und Mode, das ist unübersichtlich und macht den Quellcode nich gerade schöner.

    grüße



  • ... schrieb:

    strcmp ist C. Daher ist strcmp auch nicht im Namespace std enthalten.

    strcmp ist sowohl im globalen als auch im std Namensraum verfügbar, sofern die richtige Headerdatei (siehe camper) verwendet wird.



  • Hi!

    Wie gesagt, vergiss das C-Zeug, in C++ gibt es bessere Lösungen.

    grüße



  • David_pb schrieb:

    Wie gesagt, vergiss das C-Zeug, in C++ gibt es bessere Lösungen.

    Man sollte aber trotzdem wissen, wie dieses "C-Zeug" funktioniert. Damit meine ich nicht unbedingt printf etc., aber C-Strings sollte man schon beherrschen, auch wenn man sie später nicht benutzt.



  • Hi!

    Man kann sich das evtl mal kurz anschauen. Aber wirklich brauchen tust du sie nicht. Und in seinem Fall erst recht nicht.

    grüße



  • Kann man eigentlich mit std::string schneller die Länge eines null-terminierten char* rausfinden als mit strlen? Wenn nicht, dann bleibe ich auch bei C++ bei den C-Funktionen 🙂



  • Hi!

    std::string s( "Hallo Welt" );
    std::cout << s.length();
    

    Von Aufwand ist das wohl das selbe. Oder was meist du mit schneller?

    grüße



  • Na wenn ich es über die Stringklasse mache, muss ja erst ein Objekt erzeugt werden (evtl. wird der String dann sogar kopiert, weiß ich nicht genau). Wenn ich strlen benutze wird direkt die Länge zurückgegeben, ohne vorher die geringste Kleinigkeit zu tun.



  • Neku schrieb:

    Na wenn ich es über die Stringklasse mache, muss ja erst ein Objekt erzeugt werden (evtl. wird der String dann sogar kopiert, weiß ich nicht genau). Wenn ich strlen benutze wird direkt die Länge zurückgegeben, ohne vorher die geringste Kleinigkeit zu tun.

    Stimmt nicht :p

    Beim Aufruf von strlen wird der String komplett durchgenudelt. Beim nochmaligen Aufruf nochmal 😉

    s.length() liefert vermutlich solange denselben, konstanten Wert wie sich die String-Daten in s nicht ändern, hat also hier einen Cache-Effekt.



  • Hi!

    Wo ist dein Problem? Wenn du ein C-String verwendest benötigst du auch Speicher, also kannst du genauso gut ein string Objekt erzeugen.
    Und strlen( "Hallo Welt" );[ halt ich nicht für besonders sinnvoll, zumal hier auch eine Temporäre Variable erstellt wird.

    Und warum willst du bitte in C++ alte C Funktionen verwenden, wenn es doch viel bessere Alternativen gibt?
    Wenns dir nur um Geschwindigkeit geht, dann verwende lieber gleich reines C.

    Rest: siehe vorigen Post! 🙂

    grüße



  • LordJaxom schrieb:

    Beim Aufruf von strlen wird der String komplett durchgenudelt. Beim nochmaligen Aufruf nochmal 😉

    s.length() liefert vermutlich solange denselben, konstanten Wert wie sich die String-Daten in s nicht ändern, hat also hier einen Cache-Effekt.

    Ich brauche den Wert aber nur ein einziges Mal, Cachen ist da überflüssiger Overhead.

    David_pb schrieb:

    Wo ist dein Problem? Wenn du ein C-String verwendest benötigst du auch Speicher, also kannst du genauso gut ein string Objekt erzeugen.
    Und strlen( "Hallo Welt" );[ halt ich nicht für besonders sinnvoll, zumal hier auch eine Temporäre Variable erstellt wird.

    Der String ist bereits im Speicher -> es geht also nicht um

    ... strlen ("blubb");
    

    sondern um

    void abc (char* c) {
    ... strlen (c);
    }
    


  • Hi!

    In dem Fall ist es auch egal ob du ein std::string Objekt hast. Das ist zwar ein paar Byte größer sollte aber trotzdem vorgezogen worden.
    Wenn du so übermäßig auf Geschwindigkeit, Overhead, Bytesparenwosnurgeht achtest dann benutz C.

    grüße



  • David_pb schrieb:

    Hi!

    In dem Fall ist es auch egal ob du ein std::string Objekt hast. Das ist zwar ein paar Byte größer sollte aber trotzdem vorgezogen worden.
    Wenn du so übermäßig auf Geschwindigkeit, Overhead, Bytesparenwosnurgeht achtest dann benutz C.

    grüße

    Es geht doch gar nicht darum wie es im Speicher liegen soll. Es liegt als char-Zeichenkette im Speicher und daran kann ich nichts ändern. Es geht darum, weshalb ich ein temporäres std::string-Objekt erzeugen soll, wenn dies gar nicht notwendig ist.

    ... und C hat keine Klassen und Templates, die brauche ich 😛



  • Hi!

    Genau, C hat keine Klassen. Und C ist alt, typenunsicher und was weis denn ich...
    Wenn du die Vorzüge von C++ nutzen willst solltest du vorhandene Alternativlösungen zu C Funktionen bevorzugen.
    Aber seis drum... Mix soviel C++ und C wie nur möglich!

    grüße



  • David_pb schrieb:

    Hi!

    Genau, C hat keine Klassen. Und C ist alt, typenunsicher und was weis denn ich...
    Wenn du die Vorzüge von C++ nutzen willst solltest du vorhandene Alternativlösungen zu C Funktionen bevorzugen.
    Aber seis drum... Mix soviel C++ und C wie nur möglich!

    grüße

    Ich sehe keinen Grund eine C-Funktion nicht zu verwenden, wenn diese schneller und einfacher ist - einen Vorzug bei der C++-Lösung sehe ich hier nicht. Aber strlen muss ich sowieso bald selbst schreiben, weil der Rückgabetyp size_t ist 🙄

    Worum ging es in diesem Thread eigentlich? 😃



  • Neku schrieb:

    Kann man eigentlich mit std::string schneller die Länge eines null-terminierten char* rausfinden als mit strlen?

    Das kommt ganz auf die Situation an. Die Länge eines String Literals ist ziemlich sicher mit strlen schneller zu ermitteln. Das liegt einfach daran, dass Compiler diese Funktion idR intrinsic implementiert haben. Und wenn er optimiert, strlen sozusagen schon zur Compilezeit ausführen kann.

    Für sowas

    std::cout << strlen("Hallo") << std::endl;
    

    erzeugt der Compiler dann praktisch folgenden Code

    std::cout << size_t(5) << std::endl;
    

    Wenn es kein String Literal ist, dann ist strlen trotzdem die bessere Wahl, sofern es dir nur darum geht, die Länge zu ermitteln. strlen iteriert dann einfach über die Zeichenkette bis ein Nullzeichen gefunden wurde. Die Laufzeit hängt dann natürlich von der Länge des Strings ab. std::string::length() hat hingegen zwar eine konstante Laufzeit (idR ein simples return einer Membervariablen), du musst vorher aber halt noch ein solches Objekt erzeugen, also samt Speicherreservierung und Initialisierung. Und das ist aufwändiger und dauert länger als strlen.

    Trotzdem soll dich das nicht davon abhalten, in C++ grundsätzlich std::string zu benutzen.


Anmelden zum Antworten