Zeichenketten



  • Hallo Community,
    Folgende Klausuraufgabe ist zum Ueben bereitgestellt worden und ich habe leider keine Ahnung was damit gemeint sein soll...

    "a) Erstellen Sie eine Klasse zur Verwaltung von ASCII-Zeichen in Form einer Zeichenkette. Die Klasse habe als private Attribute einen Pointer auf ein Array von char-Variablen (kein String, also nicht durch '\0' abgeschlossen) und eine int Variable fuer die Anzahl haben. Ein Konstruktor mit Parameter "Daten"
    soll die die Objekte erzeugen. "Daten" ist ein Pointer auf ein char-Array, dessen leztes Element das Stringendezeichen ('\0') enthaelt."

    mein Problem liegt in der Aussage das das char Attribut kein String ende zeichen haben soll, wie soll das gehen 😮

    Fuer Hilfe waere ich e sehr dankbar 😃



  • Naja, eine "normale" Zeichenkette wäre...

    const char* pHi = "hi";
    

    ...wobei dann an der Stelle pHi im Speicher h + i + 0 steht. Das sollte klar sein.

    Nun sollst du es aber so machen:

    const int CHARS_LIMIT = 32; // maximale Anzahl an chars, die verwaltet werden kann
    char pChars[CHARS_LIMIT]; // Array von char-Variablen, der Ausdruck "pChars" entspricht dabei einem Pointer
    int numChars; // int Variable für (aktuelle) Anzahl, wie gefordert
    

    "pChars" zeigt jetzt also auf Speicher, wo 32 chars reserviert sind. Die sind Anfangs alle Zufallswerte oder Nullen (je nach Art der Initialisierung der Klasse/des Arrays).

    Im Konstruktor dann:

    Klasse::Klasse(const char* data)
    {
        numChars = strlen(data);
        memcpy(pChars, data, min(numChars, CHARS_LIMIT);
    }
    

    Hoffe das ist so korrekt, bin grad ziemlich eingerostet 😃



  • mhm aber so kann ich leider nicht die groeesse des Arrays zur Laufzeit bestimmen...

    Wuerde soetwas auch gehen ?

    class Zeichenkette
    {
      private:
        char* daten;
        int anz;
      public:
        Zeichenkette(char const* idaten)
        {
          anz = strlen(idaten);
          daten = new char[anz];
          memcpy(daten, idaten, anz);
        }
    


  • Ja, ich dachte halt, dass du das so nicht machen sollst.
    Die Anforderung ist auch sehr unklar..



  • Die Anforderung klingt furchtbar. Es beginnt schon damit, dass der Satz mit "habe ... haben" nicht korrekt parst.

    Man soll ASCII-Zeichen verwalten, aber offenbar ist '\0', also 1/128 aller möglichen Zeichen, schon ausgeschlossen.

    Es wird außerdem nicht klar, wozu so eine "Verwaltung" sinnvoll sein soll! Was bedeutet verwalten hier?



  • Pass auf mit sowas! Dynamische erstellte Arrays kann meines Wissens nach nur der VC++-Compiler von MS. Bei allen anderen wird es dabei Fehler geben.

    anz = strlen(idaten);
    daten = new char[anz];
    

  • Mod

    😕 Das ist ein ganz normales Sprachfeature.

    Es fehlt natürlich der ganze Rest der Speicherverwaltung¹. Was der Grund ist, warum obiger Code nicht korrekt funktionieren wird. Aber new für Arrays ist gewiss kein MS Feature.

    ¹: Da es in der Hausaufgabe gerade darum geht, diese korrekt umzusetzen, verrate ich mal nicht, wie es richtig ginge. Die kluge Lösung wäre natürlich ein std::string oder std::vector.



  • SeppJ schrieb:

    😕 Das ist ein ganz normales Sprachfeature.

    Aber new für Arrays ist gewiss kein MS Feature.

    Okay Mea culpa. War ich wohl gerade ein wenig schief gewickelt


Log in to reply