variablen neu initialisieren



  • Also statt dem char[] würde ich dann lieber gleich einen string verwenden... Aber im OP klingt es so, als würdest du die gleiche Programmlogik mehrfach aufrufen wollen. Da klingt es sauberer, die so in eine Funktion oder Klasse auszulagern, dass alle relevanten Variablen nur da gültig sind und nicht später manuell neu gesetzt werden müssen.



  • snake4ever schrieb:

    jo eigentlich verständlich, aber wo wäre denn jetzt der Unterschied zwischen

    #include <string>
    
    std::string blub;
    

    und

    #include <string>
    
    string blub;
    

    da gibt es keinen oder? da string eh zu der Klasse std gehört?

    Der Unterschied liegt darin, dass du eventuell selber noch eine Klasse string hast, wenn du die jetz auch verwenden möchtest, gibt es , wenn die andere nicht im namespace std liegen würde einen Namenskonflikt. Daher liegen auch alle Klassen aus der Standardbibliothek im namespace std.
    Dies ist auch der Grund warum der namespace eingeführt wurde, man will gleiche Namen zulassen, aber trotzdem Konflikte vermeiden.
    Man lese dazu "Effektiv C++" von Scott Meyers 😉



  • snake4ever schrieb:

    jo eigentlich verständlich, aber wo wäre denn jetzt der Unterschied zwischen

    #include <string>
    
    std::string blub;
    

    und

    #include <string>
    
    string blub;
    

    Das zweite ist schlichtweg falsch.
    Da müsste noch ein "using namespace std;" davor stehen.

    da gibt es keinen oder? da string eh zu der Klasse std gehört?

    std ist keine Klasse sondern ein Namespace, sollte eigentlich in jedem halbwegs brauchbaren C++-Buch erklärt sein.



  • snake4ever schrieb:

    char mem[100] = { 0 };
    mem="Hallo";
    

    Erstmal wird das sowieso nicht funktionieren. Und zweitens versteh ich nicht, warum du das Array erst nullst, um später die Zeichenkette "Hallo" darin zu speichern.

    snake4ever schrieb:

    mem={ 0 }    // das wünsch ich mir...geht aber leider nicht
                 // hier hilft nur memset(mem,0,100);
                 // oder eine for schleife, die alle elemente auf 0 setzt.
    

    Wie gesagt, ich versteh nicht warum du sowas machen willst. Normalerweise will man ja irgendwas sinnvolles darin speichern. Das ist genauso, wie wenn Leute NULL einem Zeiger zuweisen, um eine Zeile später diesen Wert wieder mit dem zurückgegebenen Zeiger von new/new[] zu überschreiben.

    snake4ever schrieb:

    und warum kann man nicht einfach

    cin >> "";
    

    schreiben

    Weil String Literale read-only sind.

    snake4ever schrieb:

    btw: könnte mir vielleicht noch jemand erklären was es mit dem

    using namespace std;
    

    auf sich hat?

    Neben der using Directive gibt es auch noch die using Deklaration. Damit kannst du dann einzelne Teile aus einem Namensraum in den aktuellen einbinden (falls dir der ganze zu viel ist), zB

    using std::string;
    


  • geht aber beides, also seh ich irgendwie keinen grund den namespace zu verwenden...



  • snake4ever schrieb:

    geht aber beides, also seh ich irgendwie keinen grund den namespace zu verwenden...

    Vielleicht geht es, weil dein Compiler so intelligent ist und auch den std namespace automatisch mitbenutzt, aber normalerweise geht dies nicht!
    Und Möglichkeiten von C++ nicht zu verwenden, die einem das Leben wirklich einfacher machen können, find ich persönlich wiederum nicht sooo, sagen wir mal, gut... Aber noch viel schlimmer finde ich falschen code, wie es nman schon gesagt hat, das geht so nicht. (normalerweise und bei anderen namespaces schon gar nicht).

    EDIT: Mir ist gerade aufgefallen, dass du auch einfach string.h eingebunden haben könntest, das liegt natürlich nicht im Namensraum std, sollte aber auch nicht verwendet werden! Also nimm #include <string> bzw <cstring> als C Gegenstück.



  • ist es eigentlich noch zeitgemäß in C++ mit chars, strcat und strcpy etc zu arbeiten?

    oder sollte man lieber die string klasse nehmen? etliche vorteile haben sie ja, aber sind sie auch schnell genug?



  • 1. Nein, es ist nicht zeitgemäß, das ist halt C und nicht C++
    2. String ist mindestens genauso schnell, als wenn du dir das alles selber implementierst.
    (bis auf kleine Ausnahmen und auch nicht sooo riesige Unterschiede).
    Der größte Vorteil ist halt der Komfort und die Sicherheit, die du hast, im Gegensatz dazu, wenn due mit rohen Zeigern u.ä. arbeitest.



  • ok, dann lass ich jetzt die finger von den bösen chars 😃



  • Gut so 😉
    Und denk aber auch an den Namensraum! 🙂 Lies dazu nochmal eine Seite vorher meinen letzten Betrag, den hab ich nochmal editiert.
    So, schönen Abend noch und viel Spaß damit :p

    PS: Warum gibts in C++ eigentlich nicht sowas wie byte in C#? Dann bräuchte man die chars wirklich nicht mehr :p



  • ja, du meinst, wenn man nur eine ziffer brauchst...dafür brauch man in der tat char[1];

    vielen dank für deine/eure hilfe 🙂



  • snake4ever schrieb:

    ist es eigentlich noch zeitgemäß in C++ mit chars, strcat und strcpy etc zu arbeiten?

    Wenn es um Stringmanipulation geht, dann ist std::string und co. auf jedenfall vorzuziehen. Für konstante Strings reichen char Zeiger vollkommen aus

    const char* s = "Hallo Welt!";
    


  • warum benutzt man zeiger und keine normalen chars?

    also

    const char* s="Hallo Welt!";
    //statt
    const char s[11]="Hallo Welt!";
    

    weil man sich nicht um die größe kümmern muss?



  • Du könntest auch const char[] = "Hallo Welt"; schreiben, ist alles das gleiche 😉



  • viande schrieb:

    PS: Warum gibts in C++ eigentlich nicht sowas wie byte in C#? Dann bräuchte man die chars wirklich nicht mehr :p

    typedef char byte; 😉



  • MaSTaH schrieb:

    viande schrieb:

    PS: Warum gibts in C++ eigentlich nicht sowas wie byte in C#? Dann bräuchte man die chars wirklich nicht mehr :p

    typedef char byte; 😉

    Die Idee ist gar nicht schlecht, so einfach hab ich da nie gedacht 😉 Ist bei manchen Sachen einfach einleuchtender.
    Wenn ich zB 1024 byte verschlüsseln will, will ich halt nicht 1024 Buchstaben verschlüsseln :p 🤡



  • viande schrieb:

    Du könntest auch const char[] = "Hallo Welt"; schreiben, ist alles das gleiche 😉

    Nicht ganz. Das hab ich bei dem unsized Array bis vor kurzem nämlich auch geglaubt. Fakt ist, dass die Zeigerform direkt auf das Literal verweist. Folgendes führt demzufolge zu undefiniertem Verhalten

    char* s = "Hallo Welt!";
    s[1] = 'e';
    

    Die Array Schreibweisen hingegen verwenden eine Kopie, falls erforderlich. Demzufolge ist folgendes korrekt

    char s[] = "Hallo Welt!";
    s[1] = 'e';
    


  • Liegt das nicht daran, dass das ganze const ist, wenn man beim kompilieren, einen String auf die Art initialisiert? 😕
    Wenn ich damit jetzt falsch liege, lasse ich mich aber gerne eines besseren belehren 🙂



  • typedef unsigned char BYTE
    

    würd ich machen



  • viande schrieb:

    Liegt das nicht daran, dass das ganze const ist, wenn man beim kompilieren, einen String auf die Art initialisiert? 😕

    Nun, es liegt einfach daran, dass String Literale nicht geändert werden dürfen, also read-only sind.


Anmelden zum Antworten