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. 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
- C Standardbibliothek
- Memory Management in C
- Sicherheitslücken: Buffer Overflow
- Format String Attacks