006
21.01.2004, 20:35 Uhr
0xdeadbeef
Gott (Operator)
|
Au weia. Naja, vielleicht sollten wir erstmal mit C-Strings anfangen, damit du die Basics draufkriegst. Also: Ein char ist ein einzelner Buchstabe (ein einzelnes ASCII-Zeichen, um genau zu sein). Zum Beispiel:
C++: |
#include <stdio.h>
int main() { char zeichen = 'A'; putchar(zeichen);
return 0; }
|
wird ein A auf dem Bildschirm ausgeben. Ein String ist eine Zeichenkette, also mehrere Zeichen hintereinander. In C macht man das normalerweise als Array von Zeichen, also:
C++: |
#include <stdio.h>
int main() { char s[6]; s[0] = 'H'; s[1] = 'e'; s[2] = 'l'; s[3] = 'l'; s[4] = 'o'; s[5] = 0;
puts(s);
return 0; }
|
Das Null-Zeichen am Ende des Strings ist notwendig, damit Funktionen, die nachher mit dem String arbeiten, wissen, wann er zu Ende ist. Man nennt es auch einen Sentinel oder Terminator. Natürlich ist diese Art der Notation ziemlich umständlich, aber sie zeigt, wie der String aufgebaut ist. Im echten Leben würdest du das etwa so schreiben:
C++: |
#include <stdio.h>
int main() { char s[6]; strcpy(s, "Hello"); puts(s);
return 0; }
|
oder auch:
C++: |
#include <stdio.h>
int main() { char s[] = "Hello"; puts(s);
return 0; }
|
oder, ganz einfach:
C++: |
#include <stdio.h>
int main() { puts("Hello");
return 0; }
|
Ein Problem, das sich daraus ergibt, ist natürlich, dass man immer einen Speicherbereich fester Länge anfordert. Wenn man sich nicht sicher sein kann, wie viel Input man eigentlich kriegt, kann das zu Buffer Overflows führen - wenn man nicht vorsichtig ist. Nimm Zum Beispiel das hier:
C++: |
#include <stdio.h>
int main() { char s[5]; strcpy(s, "Hello"); puts(s); return 0; }
|
"Hello" sieht zwar aus wie ein fünf Byte langer string, aber wegen des Sentinels ist er eigentlich sechs byte lang. Noch fieser ist sowas:
C++: |
#include <stdio.h>
int main() { char zeile[20]; gets(zeile); puts(zeile); return 0; }
|
Wenn der Benutzer mehr als zwanzig Zeiten eingibt, gibt es einen Buffer Overflow. Ist das soweit klar? -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |