====== std.strtype ====== ''String'' ist eine **besitzende, längentragende Zeichenkette** — die Antwort auf die drei Schwächen von ''pchar'': Ein ''pchar'' ist ein roher, NUL-terminierter C-String, dessen Länge bei jeder Abfrage neu gesucht werden muss, der kein NUL-Byte enthalten darf und dem man nicht ansieht, wem der Speicher gehört. ''String'' trägt seine Bytelänge und Kapazität explizit mit, erlaubt eingebettete NUL-Bytes und besitzt seinen Puffer. Die Unit kommt **ohne libc** aus: Der Speicher stammt ausschließlich aus ''mmap''/''munmap''. ''String'' arbeitet auf **Bytes**. Wer Zeichen im Sinne von Unicode-Codepoints zählen oder schneiden will, nimmt ''[[lyx_-_programmiersprache:units:text|std.text]]''. **Autor:** Andreas Röne\\ **Copyright:** 2024-2026 Andreas Röne → [[lyx_-_programmiersprache:units:text|std.text]] · [[lyx_-_programmiersprache:units:string|std.string]] (''pchar''-Ebene) · [[lyx_-_programmiersprache:units|Standard Library]] ---- ===== Erzeugen und freigeben ===== ''String'' ist eine **Klasse** mit Referenzsemantik. Erzeugt wird über eine der drei freien Funktionen — oder über ''%%new String()%%'' plus eine ''Init''-Methode. import std.io; import std.strtype; fn main(): int64 { var a: String := StringFromPchar("Hallo"c); var b: String := StringFromPchar(", Welt"c); var c: String := a.Add(b); // neue Zeichenkette, a und b bleiben PrintLn(IntToStr(c.Length())); // 11 var p: pchar := c.ToPchar() as pchar; // frische NUL-terminierte Kopie PrintLn(p); // "Hallo, Welt" a.Free(); b.Free(); c.Free(); return 0; } ^ Funktion ^ Beschreibung ^ | ''StringNew(cap: int64): String'' | Leere Zeichenkette mit vorreservierter Kapazität | | ''StringFromPchar(p: int64): String'' | Kopiert einen NUL-terminierten ''pchar'' | | ''StringFromBytes(ptr: int64, n: int64): String'' | Kopiert ''n'' rohe Bytes — NUL-Bytes eingeschlossen | ''Free()'' gibt den Puffer per ''munmap'' frei und setzt das Objekt auf leer zurück. Es gibt kein automatisches RAII — jede erzeugte ''String'' braucht ihr ''Free()'', auch die aus ''Add'' und ''Substring'' entstandenen Zwischenergebnisse. > **''ToPchar()'' gibt eine neue Allokation zurück, keinen Blick in den Puffer.** Die Kopie ist ''Length()+1'' Bytes groß und gehört dem Aufrufer; sie überlebt ein ''Free()'' der Quelle. Der Rückgabetyp ist ''int64'' — für ''PrintLn'' erst in eine ''pchar''-Variable schreiben (''%%var p: pchar := s.ToPchar() as pchar;%%''), ein ''as pchar'' direkt im Argument wird nicht übernommen. ---- ===== Methoden ===== ^ Signatur ^ Beschreibung ^ | ''InitCap(cap: int64)'' | Puffer mit Kapazität ''cap'' anlegen (nach ''%%new String()%%'') | | ''InitFromBytes(ptr: int64, n: int64)'' | Aus ''n'' rohen Bytes initialisieren | | ''InitFromPchar(p: int64)'' | Aus ''pchar'' initialisieren | | ''Length(): int64'' | Bytelänge — ohne NUL-Suche, O(1) | | ''CharAt(i: int64): int64'' | Byte an Position ''i''; ''0'' außerhalb der Grenzen | | ''Data(): int64'' | Zeiger auf die Rohbytes — gültig für ''Length()'' Bytes, **nicht** NUL-terminiert | | ''Reserve(need: int64): int64'' | Platz für ''need'' weitere Bytes sichern; verdoppelt die Kapazität. ''1'' = ok, ''0'' = kein Speicher | | ''AppendChar(c: int64): int64'' | Ein Byte anhängen | | ''AppendBytes(ptr: int64, n: int64): int64'' | ''n'' rohe Bytes anhängen | | ''AppendPchar(p: int64): int64'' | ''pchar'' anhängen | | ''Append(other: String): int64'' | Andere ''String'' anhängen (verändert ''self'') | | ''Add(other: String): String'' | **Neue** Zeichenkette aus ''self ++ other'' | | ''Substring(start: int64, count: int64): String'' | Neue Zeichenkette aus dem Byte-Bereich; Grenzen werden zurechtgestutzt | | ''Equals(other: String): int64'' | Inhaltsvergleich, ''1''/''0'' | | ''EqualsPchar(p: int64): int64'' | Inhaltsvergleich gegen ''pchar'' | | ''Compare(other: String): int64'' | Lexikografischer Bytevergleich: ''-1'', ''0'', ''1'' | | ''ToPchar(): int64'' | Frische NUL-terminierte Kopie; ''0'' bei Speichermangel | | ''Free()'' | Puffer freigeben | ==== Anhängen verändert, Ableiten kopiert ==== Die Unterscheidung ist wichtig für die Freigabe: ''Append*'' schreibt **in** die vorhandene Zeichenkette (der Puffer wächst bei Bedarf), ''Add'' und ''Substring'' liefern ein **neues** Objekt, das eigens freigegeben werden muss. var s: String := StringNew(16); s.AppendPchar("Zeile "c); s.AppendChar(49); // '1' PrintLn(IntToStr(s.Length())); // 7 s.Free(); ---- ===== Operatoren ===== ''String'' trägt die Methodennamen, nach denen die Operator-Überladung sucht (→ [[lyx_-_programmiersprache:sprache:oop|OOP, Abschnitt 8]]). Damit arbeiten die Operatoren **inhaltsbasiert** statt auf Adressen: ^ Operator ^ Methode ^ Ergebnis ^ | ''a + b'' | ''Add'' | neue ''String'' | | ''a == b'' | ''Eq'' | Inhaltsgleichheit | | ''a != b'' | ''Ne'' | | | ''a < b'', ''a <= b'', ''a > b'', ''a >= b'' | ''Lt''/''Le''/''Gt''/''Ge'' | abgeleitet aus ''Compare'' | | ''a[i]'' | ''Get'' | Byte an Position ''i'' | ---- Letzte Aktualisierung: 2026-08-11