Platz im Array
Das Array einer Zeichenkette hat eine feste Größe, wie jedes Array. char name[] = "Anna"; hat genau 5 Elemente: Platz für 4 Buchstaben und das '\0', nicht mehr. Wenn du später einen längeren Text darin speichern willst, gib dem Array beim Erstellen mehr Platz:
char spitzname[20] = "Anna";
int groesse = sizeof(spitzname);
int laenge = strlen(spitzname);
printf("%d %d\n", groesse, laenge);Das gibt Folgendes aus:
20 4Das Array hat 20 Elemente. Der Text belegt die ersten fünf Elemente, mit seinem '\0', und der Rest sind Nullen, genau wie bei int zahlen[5] = {0};. Deshalb liefern sizeof und strlen jetzt verschiedene Zahlen: die Größe des Arrays und die Länge des Textes darin.
Wie bringst du einen neuen Text in das Array? Nicht mit =. Wie du aus der Lektion über Arrays weißt, lässt sich einem Array nicht auf einmal etwas zuweisen:
char spitzname[20] = "Anna";
spitzname = "Max";main.c:5:15: error: array type 'char[20]' is not assignableVerwende stattdessen die Funktion strcpy (string copy, Zeichenkette kopieren) aus string.h. Sie kopiert die Zeichen eines Textes, einschließlich seines '\0', in ein Array. Schreibe in die Klammern zuerst, wohin kopiert wird, dann, was:
char spitzname[20] = "Anna";
strcpy(spitzname, "Max");
printf("%s\n", spitzname);Das gibt Folgendes aus:
MaxDie Reihenfolge ist dieselbe wie bei =: Das Ziel steht links. Ein kürzerer Text ist kein Problem. Sein '\0' markiert das neue Ende, und was danach noch im Array steht, spielt keine Rolle mehr.
Das Array muss Platz für den ganzen Text und sein '\0' haben. strcpy prüft das nicht: Es weiß nicht, wie groß das Array ist, und kopiert, bis es das '\0' erreicht. Passt der Text nicht hinein, schreibt es hinter dem Ende des Arrays weiter, in Speicher, der zu etwas anderem gehört. Wenn Clang sehen kann, dass der Text nicht passt, lässt sich das Programm hier nicht kompilieren:
char spitzname[5] = "Anna";
strcpy(spitzname, "Alexander");main.c:6:5: error: 'strcpy' will always overflow; destination buffer has size 5, but the source string has length 10 (including NUL byte) [-Werror,-Wfortify-source]Die Meldung sagt, dass das Ziel (destination buffer) Platz für 5 Zeichen hat, der Text (source string) mit dem Nullzeichen (NUL byte) aber 10 braucht. Clang kann das aber nicht immer sehen, zum Beispiel wenn der Text aus einem anderen Array kommt. Dann hält nichts das Programm auf, und es macht mit beschädigten Daten weiter. Solche Fehler haben in echten Programmen viele Sicherheitslücken verursacht. Prüfe also vor jedem strcpy, ob die Länge des Textes plus 1 in das Array passt.
Dasselbe gilt für den Starttext. C erlaubt char name[4] = "Anna";, aber dann bleibt kein Platz mehr für das '\0', und der Text hat kein Ende:
char stadt[] = "Essen";
char name[4] = "Anna";
printf("%s\n", name);
printf("%s\n", stadt);Das gibt Folgendes aus:
AnnaEssen
EssenDie erste Zeile sollte nur Anna sein. Aber printf hat danach kein '\0' gefunden und deshalb weiter ausgegeben, was nach dem Array im Speicher stand, hier zufällig das Array stadt.
So schreibst du es:
Anweisungen
- 1
Der Spieler startet ein Spiel. Kopiere unter dem
printfden Text"spielt gerade"mitstrcpyinstatusund gib den Status mit demselbenprintfnoch einmal aus. Führe das Programm aus: Es lässt sich nicht kompilieren, weilstatusnur Platz für"online"hat. Gib dem Array Platz für 20 Zeichen,char status[20] = "online";, und führe es noch einmal aus. Die Ausgabe soll mit der ZeileStatus: spielt geradeenden. - 2
Dann entfernt sich der Spieler kurz. Kopiere
"abwesend"instatusund gib den Status noch einmal aus:Status: abwesend.