Strings in C: Unterschied zwischen den Versionen

Aus dev.kaibel.net
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „= Strings in C = '''Strings''' in der Programmiersprache C sind Zeichenketten, die als Arrays von `char` repräsentiert werden und immer durch ein spezielles Nullterminierungszeichen (`'\0'`) abgeschlossen werden. Da C im Gegensatz zu höheren Programmiersprachen keinen eigenen String-Datentyp bereitstellt, müssen Speicherverwaltung und Länge von Strings explizit beachtet werden. == Darstellung von Strings == Ein String ist ein Array von Zeichen: <s…“
 
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
= Strings in C =
= Strings in C =


'''Strings''' in der Programmiersprache C sind Zeichenketten, die als Arrays von `char` repräsentiert werden und immer durch ein spezielles Nullterminierungszeichen (`'\0'`) abgeschlossen werden.   
'''Strings''' in der Programmiersprache C sind Zeichenketten, die als Arrays von ''char'' repräsentiert werden und immer durch ein spezielles Nullterminierungszeichen ('''\0''') abgeschlossen werden.   
Da C im Gegensatz zu höheren Programmiersprachen keinen eigenen String-Datentyp bereitstellt, müssen Speicherverwaltung und Länge von Strings explizit beachtet werden.
Da C im Gegensatz zu höheren Programmiersprachen keinen eigenen String-Datentyp bereitstellt, müssen Speicherverwaltung und Länge von Strings explizit beachtet werden.


Zeile 15: Zeile 15:
</syntaxhighlight>
</syntaxhighlight>


Die Nullterminierung (`\0`) markiert das Ende des Strings und ist entscheidend für viele Bibliotheksfunktionen (z. B. `strlen`, `printf`, `strcmp`).
Die Nullterminierung (''\0'') markiert das Ende des Strings und ist entscheidend für viele Bibliotheksfunktionen (z. B. ''strlen'', ''printf'', ''strcmp'').


== Wichtige Standardfunktionen für Strings ==
== Wichtige Standardfunktionen für Strings ==
Die Header-Datei `string.h` stellt grundlegende Funktionen bereit:
Die Header-Datei ''string.h'' stellt grundlegende Funktionen bereit:


{| class="wikitable"
{| class="wikitable"
! Funktion !! Beschreibung
! Funktion !! Beschreibung
|-
|-
| `strlen(s)` || Gibt die Länge eines Strings (ohne `\0`) zurück.
| ''strlen(s)'' || Gibt die Länge eines Strings (ohne ''\0'') zurück.
|-
|-
| `strcpy(dest, src)` || Kopiert einen String (ohne Längenprüfung!).
| ''strcpy(dest, src)'' || Kopiert einen String (ohne Längenprüfung!).
|-
|-
| `strncpy(dest, src, n)` || Kopiert höchstens n Zeichen.
| ''strncpy(dest, src, n)'' || Kopiert höchstens n Zeichen.
|-
|-
| `strcmp(s1, s2)` || Vergleicht zwei Strings lexikographisch.
| ''strcmp(s1, s2)'' || Vergleicht zwei Strings lexikographisch.
|-
|-
| `strcat(dest, src)` || Hängt einen String an einen anderen an.
| ''strcat(dest, src)'' || Hängt einen String an einen anderen an.
|}
|}


== Ausgabe von Strings mit printf ==
== Ausgabe von Strings mit printf ==
Die Funktion `printf` (aus `stdio.h`) dient zur Ausgabe formatierter Daten auf der Konsole.
Die Funktion ''printf'' (aus ''stdio.h'') dient zur Ausgabe formatierter Daten auf der Konsole.


=== Beispiel ===
=== Beispiel ===
Zeile 48: Zeile 48:
</syntaxhighlight>
</syntaxhighlight>


Das Formatierungssymbol `%s` steht für Strings.
Das Formatierungssymbol ''%s'' steht für Strings.


== Erstellen formatierter Strings: sprintf und snprintf ==
== Erstellen formatierter Strings: sprintf und snprintf ==


=== sprintf ===
=== sprintf ===
`sprintf` schreibt einen formatierten String in einen Puffer.
''sprintf'' schreibt einen formatierten String in einen Puffer.


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Zeile 60: Zeile 60:
</syntaxhighlight>
</syntaxhighlight>


'''Wichtig:''' `sprintf` führt **keine** Längenprüfung durch → Gefahr von **Buffer Overflows**.
'''Wichtig:''' ''sprintf'' führt **keine** Längenprüfung durch → Gefahr von **Buffer Overflows**.


=== snprintf ===
=== snprintf ===
`snprintf` ist die sichere Variante und begrenzt die Anzahl der geschriebenen Zeichen.
''snprintf'' ist die sichere Variante und begrenzt die Anzahl der geschriebenen Zeichen.


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Zeile 70: Zeile 70:
</syntaxhighlight>
</syntaxhighlight>


Der String wird automatisch mit `\0` abgeschlossen, solange die Puffergröße > 0 ist.
Der String wird automatisch mit ''\0'' abgeschlossen, solange die Puffergröße > 0 ist.


=== Vergleich ===
=== Vergleich ===
Zeile 77: Zeile 77:
! Funktion !! Längenprüfung !! Risiko
! Funktion !! Längenprüfung !! Risiko
|-
|-
| `printf` || Ausgabe auf Konsole || gering
| ''printf'' || Ausgabe auf Konsole || gering
|-
|-
| `sprintf` || keine || hoch (Buffer Overflow)
| ''sprintf'' || keine || hoch (Buffer Overflow)
|-
|-
| `snprintf` || ja || deutlich reduziert
| ''snprintf'' || ja || deutlich reduziert
|}
|}


Zeile 87: Zeile 87:
Da C keine automatische Speicherüberwachung bietet, sind folgende Regeln wichtig:
Da C keine automatische Speicherüberwachung bietet, sind folgende Regeln wichtig:
* Immer Puffergrößen kennen.
* Immer Puffergrößen kennen.
* `snprintf` statt `sprintf` verwenden.
* ''snprintf'' statt ''sprintf'' verwenden.
* Nie ungeprüfte Benutzereingaben direkt kopieren.
* Nie ungeprüfte Benutzereingaben direkt kopieren.
* Bei dynamischer Allokation an `free()` denken.
* Bei dynamischer Allokation an ''free()'' denken.


== Beispielprogramm ==
== Beispielprogramm ==
Zeile 108: Zeile 108:


== Boost.Format (C++) ==
== Boost.Format (C++) ==
Während C keine komfortablen Formatierungsmechanismen über `printf` hinaus bietet, stellt die C++-Bibliothek '''Boost.Format''' ein flexibles Formatierungssystem bereit, das typsicher und ausdrucksstark ist.
Während C keine komfortablen Formatierungsmechanismen über ''printf'' hinaus bietet, stellt die C++-Bibliothek '''Boost.Format''' ein flexibles Formatierungssystem bereit, das typsicher und ausdrucksstark ist.


Boost.Format verwendet ein Format ähnlich zu `printf`, aber in **C++-typischer Syntax**:
Boost.Format verwendet ein Format ähnlich zu ''printf'', aber in **C++-typischer Syntax**:
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
#include <boost/format.hpp>
#include <boost/format.hpp>
Zeile 130: Zeile 130:
=== Nachteile ===
=== Nachteile ===
* Boost ist eine zusätzliche Abhängigkeit
* Boost ist eine zusätzliche Abhängigkeit
* Geringere Performance als `printf` oder `snprintf` in sehr zeitkritischen Bereichen
* Geringere Performance als ''printf'' oder ''snprintf'' in sehr zeitkritischen Bereichen


== Zusammenfassung ==
== Zusammenfassung ==
* In C sind Strings nullterminierte `char`-Arrays.
* In C sind Strings nullterminierte ''char''-Arrays.
* `printf`, `sprintf` und `snprintf` ermöglichen formatierte Ausgabe bzw. Stringgenerierung.
* ''printf'', ''sprintf'' und ''snprintf'' ermöglichen formatierte Ausgabe bzw. Stringgenerierung.
* Für sichere Stringmanipulation sollte **immer `snprintf` gegenüber `sprintf` bevorzugt werden**.
* Für sichere Stringmanipulation sollte **immer ''snprintf'' gegenüber ''sprintf'' bevorzugt werden**.
* In C++ bietet `Boost.Format` eine moderne, typsichere Alternative zur Formatierung.
* In C++ bietet ''Boost.Format'' eine moderne, typsichere Alternative zur Formatierung.


== Siehe auch ==
== Siehe auch ==

Aktuelle Version vom 6. November 2025, 12:38 Uhr

Strings in C

Strings in der Programmiersprache C sind Zeichenketten, die als Arrays von char repräsentiert werden und immer durch ein spezielles Nullterminierungszeichen (\0) abgeschlossen werden. Da C im Gegensatz zu höheren Programmiersprachen keinen eigenen String-Datentyp bereitstellt, müssen Speicherverwaltung und Länge von Strings explizit beachtet werden.

Darstellung von Strings

Ein String ist ein Array von Zeichen:

char text[] = "Hallo";

Intern sieht das so aus:

'H' 'a' 'l' 'l' 'o' '\0'

Die Nullterminierung (\0) markiert das Ende des Strings und ist entscheidend für viele Bibliotheksfunktionen (z. B. strlen, printf, strcmp).

Wichtige Standardfunktionen für Strings

Die Header-Datei string.h stellt grundlegende Funktionen bereit:

Funktion Beschreibung
strlen(s) Gibt die Länge eines Strings (ohne \0) zurück.
strcpy(dest, src) Kopiert einen String (ohne Längenprüfung!).
strncpy(dest, src, n) Kopiert höchstens n Zeichen.
strcmp(s1, s2) Vergleicht zwei Strings lexikographisch.
strcat(dest, src) Hängt einen String an einen anderen an.

Ausgabe von Strings mit printf

Die Funktion printf (aus stdio.h) dient zur Ausgabe formatierter Daten auf der Konsole.

Beispiel

#include <stdio.h>

int main() {
    char name[] = "Alice";
    printf("Hallo %s!\n", name);
    return 0;
}

Das Formatierungssymbol %s steht für Strings.

Erstellen formatierter Strings: sprintf und snprintf

sprintf

sprintf schreibt einen formatierten String in einen Puffer.

char buffer[50];
sprintf(buffer, "Ergebnis: %d", 42);

Wichtig: sprintf führt **keine** Längenprüfung durch → Gefahr von **Buffer Overflows**.

snprintf

snprintf ist die sichere Variante und begrenzt die Anzahl der geschriebenen Zeichen.

char buffer[50];
snprintf(buffer, sizeof(buffer), "Ergebnis: %d", 42);

Der String wird automatisch mit \0 abgeschlossen, solange die Puffergröße > 0 ist.

Vergleich

Funktion Längenprüfung Risiko
printf Ausgabe auf Konsole gering
sprintf keine hoch (Buffer Overflow)
snprintf ja deutlich reduziert

Sichere String-Behandlung

Da C keine automatische Speicherüberwachung bietet, sind folgende Regeln wichtig:

  • Immer Puffergrößen kennen.
  • snprintf statt sprintf verwenden.
  • Nie ungeprüfte Benutzereingaben direkt kopieren.
  • Bei dynamischer Allokation an free() denken.

Beispielprogramm

#include <stdio.h>
#include <string.h>

int main() {
    char name[] = "Alice";
    char msg[100];

    snprintf(msg, sizeof(msg), "Hallo %s, willkommen!", name);
    printf("%s\n", msg);

    return 0;
}

Boost.Format (C++)

Während C keine komfortablen Formatierungsmechanismen über printf hinaus bietet, stellt die C++-Bibliothek Boost.Format ein flexibles Formatierungssystem bereit, das typsicher und ausdrucksstark ist.

Boost.Format verwendet ein Format ähnlich zu printf, aber in **C++-typischer Syntax**:

#include <boost/format.hpp>
#include <iostream>

int main() {
    std::string name = "Alice";
    int score = 42;

    std::cout << boost::format("Name: %1%, Punkte: %2%") % name % score << std::endl;
}

Vorteile gegenüber printf

  • Typprüfung zur Compile-Zeit (vermeidet Formatierungsfehler)
  • Beliebige Datentypen formattierbar (auch Klassen)
  • Lesbarer und wartbarer Code

Nachteile

  • Boost ist eine zusätzliche Abhängigkeit
  • Geringere Performance als printf oder snprintf in sehr zeitkritischen Bereichen

Zusammenfassung

  • In C sind Strings nullterminierte char-Arrays.
  • printf, sprintf und snprintf ermöglichen formatierte Ausgabe bzw. Stringgenerierung.
  • Für sichere Stringmanipulation sollte **immer snprintf gegenüber sprintf bevorzugt werden**.
  • In C++ bietet Boost.Format eine moderne, typsichere Alternative zur Formatierung.

Siehe auch

Weblinks