Name mit char?



  • Hacker schrieb:

    P.S.: 'string Name;' ist sehr viel nützlicher als

    char* Name;// (Die C-String Deklaration)
    

    , denn der ist sehr viel schlechter, und die einzige andere Möglichkeit um einen String zu erzeugen (außer

    char Zeigername[anzahl_Zeichen];
    

    , was so ungefähr dasselbe ist). Deswegen würd ich mir das nochmal ganz genau angucken.

    Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist" 😉
    Auf system("pause"); geh ich mal nicht ein.



  • Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist" 😉
    Auf system("pause"); geh ich mal nicht ein.

    Ich bin sicher system(); war nur als Beispiel , was du sicher genau weißt 😉
    Und ich fin string auch besser weil char schlechter ist x'DD..... 😋 🤡



  • 314159265358979 schrieb:

    Hacker schrieb:

    P.S.: 'string Name;' ist sehr viel nützlicher als

    char* Name;// (Die C-String Deklaration)
    

    , denn der ist sehr viel schlechter, und die einzige andere Möglichkeit um einen String zu erzeugen (außer

    char Zeigername[anzahl_Zeichen];
    

    , was so ungefähr dasselbe ist). Deswegen würd ich mir das nochmal ganz genau angucken.

    Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist" 😉
    Auf system("pause"); geh ich mal nicht ein.

    1. system("pause") hab ich nur gelassen, weil er es auch drin hatte.

    2. Willst du Gründe?

    -char* hat massig Probleme mit Pufferüberläufen, es wird dank nicht aufgepassten Kopierfunktionen wie strcpy oder strcat in unerlaubte Speicherbereiche geschrieben was schlimme Folgen haben kann

    -Es ist sehr umständlich, die ganzen Funktionen zum Bearbeiten zu verwenden, die ja in string bereits vereinfacht und effektiv untergebracht sind;

    Beispielcode:

    #include <iostream>
    #include <string>
    #include <cstring>
    
    using namespace std;
    
    int main(){
    
        char a[10]="lalala";/*bzw. strcpy(),strncpy();*/
        string b("lalala");//Funktioniert auch mit anderen strings, auch für Bereichs-übernahme (z.B.: string c(b,3,3);)
                           // Was es (soweit ich weiß) in C gar nicht gibt.
    
        /*Länge des C-Strings a nicht regulier-bar.
        Die des C++-Strings b hingegen wunderbar und implizit, z.b. mit resize,reserve*/
    
        b.length();// bzw. size()
        strlen(a); // C-String funktion
    
        strcat(a,"wef"); // bzw. strncat();
        b += "wef";        //Sehr viel einfacher, Dank überladenen Operatoren kein Problem
    
        strcpy(a,"la");// Zu verwenden auch bei einem anderen C-String
        b = "la";      // Dank überladenen Operatoren kein Problem, es geht auch .assign("la");
    
        /*Auch noch andere lasten werden abgenommen, darunter auch die Suchfunktionen -
        mit C-Strings strstr,strchr,strrchr, strcspn,(memchr) ...
        In C++-Strings dank überladener Member-Funktionen mit find und rfind  */
    
        strchr(a,'l');//bzw. strrchr();
        b.rfind('l'); // Kann für vieles genutzt werden (zusammen mit .find();)
    
        //Strings kann man auch z.b. als c-Strings einer C-Funktion übergeben, mit
    
        b.c_str();
        b.data();
        b.copy(a,3,1);//Kopiert in C-strings
    
        //Dann gibts noch insert(), welches strings ineinander setzt:
        b.insert(0,a);
        //swap vertauscht die Inhalte zweier c++-Strings:
        string c("lala");
        b.swap(c);
        //append:
        b.append("lalla");//Wie strcat in C
        //erase zum löschen von bereichen, clear zum leeren, replace(ähnlich wie assign), sind alles weitere, sehr nützliche
        //Funktionen, die alles erleichtern.
    
        b.erase(2,4);
        b.clear();
        b.replace(0,4,a);//Ersetzt ab pos. 0 4 Zeichen mit dem C-String a
    }
    

    🕶



  • [Rewind] schrieb:

    ja schrieb:

    char ist auch nur ein Zeichen, nimm std::string, für den Anfang reicht der, auch wenn er nicht toll ist.

    Was hättest du den sonst anzubieten, was in der Anwendungsbreite von std::string besser ist?

    Wenn du etwas mehr als nur Konsole willst und auch noch im asiatischen Raum SW verkaufen willst würde ich einen Unicode fähigen String nehmen, der zum GUI Framework passt, z.b. QString.



  • Dann nimm std::wstring. Gibt auch noch ein typedef für einen 32-bittigen String, dessen Name mir gerade nicht einfällt. Die C++-Leute haben an sowas schon gedacht, keine Sorge.



  • 314159265358979 schrieb:

    Dann nimm std::wstring. Gibt auch noch ein typedef für einen 32-bittigen String, dessen Name mir gerade nicht einfällt. Die C++-Leute haben an sowas schon gedacht, keine Sorge.

    wstring löst, außer dem Problem zu wenig Speicherplatz aufgrund der gewählten Zeichenrepräsentation zu haben, gar nichts.



  • Von welchen Problemen ist die Rede?



  • 314159265358979 schrieb:

    Von welchen Problemen ist die Rede?

    Ic denke mal, "ja" meint nicht nur, dass ein std::string zu klein ist, Unicode zu speichern (was ja auch nicht per se der Fall ist), sondern die fehlende Unterstützung für Internationalisierung in C++ allgemein. Er will eine Stringklasse die direkt Unicode unterstützt und nicht nur genug Speicher dafür anbietet. QString kann das zum Beispiel. Ob das nun gut ist, sei mal dahingestellt. Mir persönlich kann std::string schon viel zu viel...



  • Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.

    Aber Internationalisierung ist doch schon durch locales vorhanden?



  • 314159265358979 schrieb:

    Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?

    Was laberst du da?
    Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
    std::string !



  • 314159265358979 schrieb:

    Aber Internationalisierung ist doch schon durch locales vorhanden?

    Die Möglichkeit dafür schon, ja. In der Praxis benutzt das aber irgendwie kaum einer (ich habe es zumindest bis jetzt nie gesehen). Vielleicht habe ich Scheuklappen auf, aber die Meisten die ich kenne, und die mit Internationalisierung zu tun haben, benutzen dafür irgendwelche Frameworks. Mit C++ Bordmitteln arbeitet irgendwie keiner, weils wohl zu kompliziert ist.



  • Hacker schrieb:

    314159265358979 schrieb:

    Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?

    Was laberst du da?
    Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
    std::string !

    Nahezu alle, die über das, was std::vector anbietet hinausgehen...



  • Hacker schrieb:

    314159265358979 schrieb:

    Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?

    Was laberst du da?
    Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
    std::string !

    Ich habe mir mal erlaubt, dir Funktionen direkt aus dem Standard zu kopieren:

    size_type find (const basic_string& str, size_type pos = 0) size_type find (const charT* s, size_type pos, size_type n) size_type find (const charT* s, size_type pos = 0) const; size_type find (charT c, size_type pos = 0) const noexcept; size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; size_type rfind(const charT* s, size_type pos, size_type n) const;
    size_type rfind(const charT* s, size_type pos = npos) const; size_type rfind(charT c, size_type pos = npos) const noexcept;
    size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
    size_type find_first_of(const charT* s, size_type pos, size_type n) const;
    size_type find_first_of(const charT* s, size_type pos = 0) const; size_type find_first_of(charT c, size_type pos = 0) const noexcept; size_type find_last_of (const basic_string& str,
    size_type pos = npos) const noexcept; size_type find_last_of (const charT* s,
    size_type pos, size_type n) const; size_type find_last_of (const charT* s, size_type pos = npos) const;
    size_type find_last_of (charT c, size_type pos = npos) const noexcept;
    size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
    size_type find_first_not_of(const charT* s, size_type pos, size_type n) const;
    size_type find_first_not_of(const charT* s, size_type pos = 0) const; size_type find_first_not_of(charT c, size_type pos = 0) const noexcept; size_type find_last_not_of (const basic_string& str,
    size_type pos = npos) const noexcept; size_type find_last_not_of (const charT* s, size_type pos,
    size_type n) const; size_type find_last_not_of (const charT* s,
    size_type pos = npos) const;

    Das ist noch lang nicht alles.

    Und so ganz nebenbei: Hör auf mit deinen absolut trotteligen Posts. Die sind ja noch schlimmer als meine.



  • Jede dieser Funktionen könnte man irgendwann mal brauchen,
    keine davon ist direkt unnötig. Die Leute die diese Standards machen wissen was wieso wohin, O.K. ?

    P.S.: Du hast mir grad 20 verschiedene anstatt nur einer einzigen Funktin vor die Nase gepackt - sind die jetzt alle unnötig ...?



  • Nein, diese Memberfunktionen sind absolut unnötig. Würdest du etwas von gutem Design verstehen, dann wüsstest du, dass Non-Member stets vorzuziehen sind.

    Und nun halt endlich deine verdammte Fresse, du gehst mir auf die Eier!


  • Mod

    Hacker schrieb:

    Jede dieser Funktionen könnte man irgendwann mal brauchen,
    keine davon ist direkt unnötig. Die Leute die diese Standards machen wissen was wieso wohin, O.K. ?

    P.S.: Du hast mir grad 20 verschiedene anstatt nur einer einzigen Funktin vor die Nase gepackt - sind die jetzt alle unnötig ...?

    Erklär mal, warum das Member von String sein müssen. Das sind nämlich alles Algorithmen die man wunderbar auf beliebigen Iteratorstartendpaaren implementieren könnte.



  • Hacker schrieb:

    Die Leute die diese Standards machen wissen was wieso wohin, O.K. ?

    Nein.



  • 314159265358979 schrieb:

    Und nun halt endlich deine verdammte Fresse, du gehst mir auf die Eier!

    Halt dich mal zurueck. Du bist noch lange kein Oberchecker. Und beleidigen geht mal gar nicht.



  • Bei sowas kann man sich nicht mehr zurückhalten.



  • ich offensichtlich schon. Lerne einfach durchzuatmen. Das tu ich bei dir oftmals auch.


Anmelden zum Antworten