String einlesen und als nicht durch 0 terminiertes char-Array speichern, genaueres Inside...



  • Hey,

    also ich habe eine C++ Aufgabe, bei der ich die Aufgabenstellung einfach nicht wirklich verstehe. Vielleicht kann mir jemand von euch mit eigenen Worten einmal beschreiben was genau da von mir verlangt wird, denn ich erkenne den Sinn dahinter nicht wirklich und suche deshalb dringend Hilfe. Ich möchte die Aufgabe gerne lösen, aber ohne einen kleinen Schubser schaffe ich es einfach nicht. Hier die genaue Aufgabe:

    Erstellen Sie in C++ den Code für eine Klasse "String" für Zeichenketten so, dass intern die Strings als char-Array gespeichert werden. Die Zeichenketten sollen intern nicht durch \0 terminiert werden, sondern in einem Attribut "Laenge" wird die Anzahl der Zeichen des Strings abgelegt! Geben Sie hierfür neben den notwendigen Attributen und dem erforderlichen Konstruktor auch eine get-Methode an zum Lesen des Inhaltes (Rückgabe ist \0-terminiertes char-array!). Der Konstruktor habe die Signatur "String(char *param);" param sei dabei eine durch \0-terminierte Zeichenkette.

    Ich bin gespannt ob irgendwer damit was anfangen kann, denn in meinen Augen würde ich nichts anderes tun, als den String intern in ein char-Array umzuwandeln, die 0 am Ende des Strings abzuschneiden, nur um sie dann wieder bei der Ausgabe per get-Methode am char-Array wieder anzuhängen! Sinnvoll wäre es meiner Meinung nach, sich nach jedem Schritt die Länge des Strings bzw. Arrays ausgeben zu lassen um zu demonstrieren wann die 0 angehangen ist und wann nicht.

    Ich wäre sehr dankbar für jede Idee, jeden Hinweis und jeden Vorschlag zur theoretischen Lösung des Problems!

    Liebe Grüße,

    logic



  • typedef std::string String;
    

    😉

    Also die Aufgabenstellung ist so klar, dass ich gar nicht weiß, wo Deine Frage liegt...

    Gruß,

    Simon2.



  • das heißt also, ich soll eine Klasse String entwerfen, mit der Speicherung einer Zeichenkette, und einer Methode um die Zeichenkette wieder auszugeben-

    Im hauptprogramm soll ich dann ein Objekt der neuen Klasse "String" erzeugen, in das ich quasi eine vom Benutzer eingegebene Zeichenkette speichere, und mir diese durch die oben genannte get-Methode wieder ausgeben lassen kann auf dem Bildschirm?



  • du hast doch in deinem posting sogar schon die lösung mit angegeben. find die aufgabenstellung auch sehr eindeutig.



  • meinst du damit mein theoretisches Herangehen an die Lösung der Aufgabe?



  • jo. ich seh bei der aufgabe nur zwei knackpunkte, über die man sich gedanken machen sollte:

    - wenn die methode get die interne struktur eines exemplars offenlegt, kann diese u.u. manipuliert werden und zerstört somit die konsistenz des exemplars. deshalb evtl. eine defensive kopie zurückliefern
    - wenn man sich aus gründen der kapselung für eine defensive kopie entscheidet, wie verhindert man effektiv speicherlecks?



  • als Ergänzung steht unter der Aufgabe noch:

    Programmieren Sie Ihre Methoden so, dass keine Kopien von Objekten erstellt werden müssen. Erstellen Sie ein Testprogramm so, dass die Funktion aller geforderten Merkmale demonstriert wird.

    (Zur Erläuterung: die Aufgabe hat noch Teil b) und c), aber ich möchte erstmal den Aufgabenteil a) hinter mich bringen)

    Das könnte man doch so deuten dass die Kapselung erstmal Außen vor gelassen werden kann oder?

    Es steht auch keine Forderung nach einer bestimmten Eingabelänge, daher würde ich zunächst die Menge der Zeichen willkürlich auf sagen wir 20 festlegen...



  • keine kopien? hm, die aufgabe ist doch komplizierter, als sie aussieht 😉 eine begrenzung der eigabelänge sehe ich nicht als vorteil an. den speicher je nach eingabelänge zu allozieren ist nur eine fingerübung. aber die interne datenrepräsentation ohne kopie (!) wieder mit 0 zu terminieren ist nicht trivial.



  • const char* ?



  • Die Aufgabe widerspricht sich doch.
    Wenn intern kein 0 terminiertes Array gespeichert werden darf, wie soll man dann ohne eine Kopie anlegen zu dürfen ein 0 terminiertes Array zurückgeben.
    Geht nich...



  • doch, das geht schon. indem man z.b. eine klasse baut, die den char* cast-operator überlädt, sich also wie nen char verhält, mit ner referenz auf das nicht terminierte char array versorgt und die entsprechenden pointer operatoren überlädt, um bei zugriff auf das "letzte" element eine erzwungene 0 zurückzuliefern.



  • ok dann sollte ich evtl. noch die beiden weiteren Teile der Aufgabe posten, vielleicht lichtet sich dann der nebel 🙂 :

    b) Geben Sie eine Methode für die Verkettung von Instanzen dieser Klasse an (concatenate-Operator "+")

    c) Erstellen Sie einen Copy-Konstruktor und überladen Sie den Zuweisungsoperator!

    Ich habe bisher nur in Java programmiert, und deshalb sind gerade diese Aufgaben für mich doch recht heftig. Sonst würde ich auch nicht nach Hilfe fragen... 😞



  • thordk schrieb:

    doch, das geht schon. indem man z.b. eine klasse baut, die den char* cast-operator überlädt, sich also wie nen char verhält, mit ner referenz auf das nicht terminierte char array versorgt und die entsprechenden pointer operatoren überlädt, um bei zugriff auf das "letzte" element eine erzwungene 0 zurückzuliefern.

    Glaub kaum das sowas verlangt wird, wenn man sich den Rest der Aufgabe anschaut.



  • vielleicht bin ich auch einfach nur zu dumm um die Aufgabe zu verstehen und sie zu lösen, aber selbst wenns so ist wäre ich wirklich unendlich dankbar wenn mir vielleicht jemand auf die Sprünge helfen würde...



  • Schreib ne Klasse String mit dem Konstruktor, ermittle die länge des übergebenen Strings und kopier den in ein entsprechend großes array und speicher die länge in ner variable. (Hier keine Kopie zu machen wäre sehr gefährlich)



  • mit kopien zu arbeiten ist wesentlich sicherer, viel einfacher und generell vorzuziehen. ich würds einfach machen und in den kommentar schreiben, aus welchen gründen eine kopie erzeugt wird.
    mein schnellschuss mit dem char* container hat z.b. nicht berücksichtigt, dass polymorphie für primitive objekte nicht funktioniert 😉



  • gehtnix schrieb:

    ...Wenn intern kein 0 terminiertes Array gespeichert werden darf,...

    Ich glaube nicht, dass diese Aufgabe derart spitzfindig gemeint ist.
    Ich denke mal, der Aufgabensteller möchte hier, dass der Umgang mit expliziten Längen (und nicht mit strlen(), strcpy, ...) geübt/demonstriert wird.
    Und das "Kopieverbot" ist vermutlich auch eher als Vereinfachung gedacht (und vielleicht soll ja in der Folgeübung gezeigt werden, wo dabei die Gefahren liegen).
    Also im Prinzip ist nur doch das hier:

    das heißt also, ich soll eine Klasse String entwerfen, mit der Speicherung einer Zeichenkette, und einer Methode um die Zeichenkette wieder auszugeben-

    in Source zu gießen.
    Ich an Stelles des OPs würde einfach mal loslegen und mir nicht im Vorhinein alle möglichen Interpretationsweisen des Aufgabentextes durchphilosophieren.
    Und wenn dann ein konkretes Ergebnis da ist, können wir hier ja noch Verbesserungsmöglichkeiten/Alternativen diskutieren....
    Ist doch eine Programmieraufgabe und keine Exegese, oder ? 😉

    Gruß,

    Simon2.



  • Die Aufgabe ist IMO komplett dämlich formuliert. Wer auch immer sie formuliert hat ist IMO ganz weit davon entfernt geeignet zu sein um C++ zu unterrichten.
    Alleine das fehlende const im ctor und die Formulierung "Rückgabe ist \0-terminiertes char-array"... OMFG. Bin ich froh dass ich damit nichts zu tun habe!



  • Ich glaube hier soll auch nicht C++, sondern Programmieren unterrichtet werden.



  • doppeldeutig schrieb:

    Ich glaube hier soll auch nicht C++, sondern Programmieren unterrichtet werden.

    Und dann ist es OK so mies formulierte Aufgaben zu stellen?
    BTW: ich glaube auch nicht dass wer auch immer das geschrieben hat kompetent ist Programmieren zu unterrichten. Dafür schreibt er zu schluderig.


Anmelden zum Antworten