Kapitel sieben - Arrays & Strings

Umgang mit Arrays (Wertelisten) und Zeichenfolgen (Buchstabenlisten) in C.

Die Variablen, die wir bisher betrachtet haben, sind alle einzelne numerische Werte. In diesem Kapitel werden wir uns ansehen, wie C mit Wertelisten umgeht. Dies führt dazu, dass Buchstabenlisten zum Speichern und Bearbeiten von Textzeichenfolgen verwendet werden.

Ein Array ist eine einzelne Variable, in der mehrere unterschiedliche Werte desselben Typs gespeichert sind. Auf die einzelnen Werte wird durch Indizieren des Arrays zugegriffen. Ein Array kann eine oder mehrere Dimensionen haben. Ein eindimensionales Array ist eine einzelne Liste von Werten, während ein zweidimensionales Array eine Liste von Wertelisten usw. ist. Ein Array wird in C deklariert, indem die Größe jeder Dimension in eckige Klammern nach dem Variablennamen gesetzt wird. Daher ist

int a[10];

eine Liste von 10 Integern, während

int b[5][6];

eine Liste ist, die 5 Listen mit jeweils 6 Integern beïnhaltet.

Beim Zugriff auf die Elemente innerhalb eines Arrays beginnt der Array-Index, die Zahl in der eckigen Klammer, bei 0. Die 10 im Array a, siehe oben, enthaltenen Ganzzahlen werden daher als a[0], a[1], a[2] und so weiter bezeichnet bis zu einem a[9]. Der Compiler erlaubt Ihnen, eine a[10], eine a[11] oder eine a[beliebige Zahl] zu lesen oder zu schreiben, aber diese befinden sich alle außerhalb des Speichers, der bei der Deklaration des Arrays zugewiesen wurde. In diesen Speicherberich zu schreiben ist eine sehr schlechte Idee.

[Bleiben sie in ihrem Array] Eine der schlimmsten Ursachen für Abstürze und Fehler in C ist das Erstellen eines Arrays und das anschließende Schreiben über das Ende hinaus. Der Compiler hält sie nicht davon ab, am Ende eines Arrays in den Speicher zu schreiben. Dies kann schwerwiegende Folgen haben. Stellen sie immer sicher, dass Ihre Array-Indizes in Ihr Array passen.

Arrays und Zeiger (Pointer)

Dies bringt uns zu der Beziehung zwischen Zeigern und Arrays. Der Name eines Arrays ist effektiv ein Zeiger auf das erste Element des Arrays. Denken sie daran, dass ein Zeiger die Adresse einer Variablen im Speicher ist?

Nun, ein Array ist ein zusammenhängender Speicherblock, der alle Elemente des Arrays der Reihe nach enthält, sodass sie mit einem Zeiger darauf zugreifen können. (selbst wenn sie Werte in eckigen Klammern verwenden, um darauf zuzugreifen, behandelt der Compiler diese ohnehin als Zeiger.) Hier ein Beispiel:

#include <stdio.h> void main (void) { int a[10]; int count; for (count = 0; count < 10; count++) { a[count] = count * 10 + count; } printf ("Das erste und zweite Element von a haben den Wert %d und %d\n", a[0], a[1]); printf ("Oder, als Pointer, %d and %d\n", *a, *(a+1)); }

Dies füllt die 10 Werte von a mit den Zahlen 0, 11, 22, 33 usw. und liest dann a[0] und a[1]. Anschließend werden dieselben Werte mit a als Zeiger gelesen, und sie können feststellen, ob der Code identisch ist. Bei einem zweidimensionalen Array oder höher müssen sie berücksichtigen, wie der Compiler die Dimensionen im Speicher anordnet. Dazu werden die Elemente am Index ganz rechts des Arrays zusammengefasst. Mit dem obigen Array b[5][6] zeigt b selbst auf b[0][0]. b + 1 Punkte bei b[0][1]; b+5 Punkte bei b[0][5]; und b+6 Punkte bei b[1][0].

Man kann ein Array gleichzeitig mit der Deklaration initialisieren, indem man die Werte in geschweifte Klammern setzt.

int a[10] = { 0, 11, 22, 33, 44, 55, 66, 77, 88, 99 };

Allerdings ist zu beachten, dass dies nur funktioniert, wenn das Array zum ersten Mal deklariert wird. Sobald es vorhanden ist, kann man diese Verknüpfung nicht mehr verwenden und man muss die Array-Indizes durchlaufen und jeden Wert nacheinander festlegen.

[NAMEN SIND POINTER] Denken sie daran, dass der Name eines Arrays oder einer Zeichenfolge nur ein Zeiger auf das erste Element des betreffenden Arrays oder der betreffenden Zeichenfolge ist und auf dieselbe Weise wie jeder andere Zeiger verwendet werden kann. Es kann inkrementiert und dekrementiert oder dereferenziert werden, um den Wert zu finden, auf den es zeigt.

Array

Oben: Array-Elemente werden nacheinander im Speicher gespeichert, wobei der Array-Name ein Zeiger auf das erste Element ist. Mehrdimensionale Array-Elemente werden mit den Elementen mit benachbarten Werten im Index ganz rechts nebeneinander gespeichert.

Strings

In C ist eine Zeichenfolge nur ein anderes Array. Es handelt sich um eine Reihe einzelner Zeichen. Ein Zeichen ist ein bestimmter Typ in C, der als char bezeichnet wird. Dies enthält ein einzelnes Byte, das ausreicht, um ein alphanumerisches Zeichen aufzunehmen. Ein String mit zehn Bytes wäre also:

char mystring[10];

Oder um es gleichzeitig zu initialisieren:

char mystring[10] = "thestring";

Eine wichtige Sache, die man beachten sollten, ist, dass eine Zeichenfolge in C immer mit einem auf Null gesetzten Byte enden muss und dass der Speicher, der zum Halten dieser letzten Null erforderlich ist (als Zeichenfolgenabschluss bezeichnet), zugewiesen werden muss, wenn man die Zeichenfolge deklariert. mystring, das als Array mit 10 Zeichen deklariert ist, kann also nur Text mit 9 oder weniger Zeichen enthalten.

Array

Oben: Zeichenfolgen werden als Array einzelner Zeichen gespeichert, wobei das Element nach dem letzten Zeichensatz auf Null gesetzt wird.

[STRINGS TERMINIEREN] Denken sie immer daran, dass der Speicher, den sie einer Zeichenfolge zuweisen, lang genug sein muss, um alle Zeichen zu speichern, plus eine zusätzliche, um die abschließende Null zu speichern. Wenn sie Zeichenfolgen selbst mit Zeigern bearbeiten, denken sie daran, die Null am Ende jeder von Ihnen erstellten Zeichenfolge zu schreiben.

sie können den Index in eckigen Klammern verwenden, um auf einzelne Zeichen in einer Zeichenfolge zuzugreifen, oder sie können einen Zeiger verwenden. Hier ist ein Beispiel für die Verwendung von Zeigern, um zwei Zeichenfolgen miteinander zu verbinden:

#include <stdio.h> void main (void) { char str1[10] = "first"; char str2[10] = "second"; char str3[20]; char *src, *dst; src = str1; dst = str3; while (*src != 0) { *dst = *src; src++; dst++; } src = str2; while (*src != 0) { *dst = *src; src++; dst++; } *dst = 0; printf ("%s + %s = %s\n", str1, str2, str3); }

Zuerst erstellen wir zwei Zeichenfolgen - str1 ist „first“ und str2 ist „second“ - und wir weisen eine leere Zeichenfolge, str3, zu, um das Ergebnis einzugeben. Anschließend erstellen wir ein Paar Zeichenzeiger und zeigen src am Anfang von str1 (das „f“ von „first“) und dst am Anfang des leeren str3. Wir gehen in eine schleife, kopieren den Inhalt von src nach dst und bewegen dann beide Zeiger um eins vorwärts, bis wir die Null finden, die str1 beendet.

Wir zeigen dann src2 nach str und machen dasselbe noch einmal, bis wir die Null am Ende von str2 finden. Schließlich schreiben wir eine Null an das Ende von str3, um es zu beenden. Beachten sie den neuen Formatbezeichner zum Drucken von Zeichenfolgen. %s wird zum Drucken einer Zeichenfolge verwendet und zeigt jedes Zeichen vom als Argument angegebenen Zeiger bis zur ersten gefundenen, abschließenden, Null an. (Wenn sie ein einzelnes Zeichen drucken möchten, können sie den Formatbezeichner %c verwenden.)

Die Ausgabe des obigen Programms:

first + second = firstsecond

In Strings schreiben

Da der Name einer String-Variablen nur ein Zeiger auf das erste Zeichen der Zeichenfolge ist, können sie nicht einfach ein Gleichheitszeichen verwenden, um den Wert einer vollständigen Zeichenfolge festzulegen. sie können eine Zeichenfolgenvariable wie oben zum Zeitpunkt der Deklaration initialisieren. Was ist jedoch, wenn sie sie später festlegen oder ändern möchten?

[BLEIB INNERHALB DEINES STRINGS] Wie bei Arrays ist es noch einfacher, das Ende eines Strings abzuschneiden und dadurch den Speicher an anderer Stelle zu beschädigen. Deklarieren sie im Zweifelsfall die String-Variablen mit mehr Speicherplatz, als sie für erforderlich halten, und stellen sie sicher, dass das, was sie in sie schreiben, tatsächlich passt.

Es gibt einige Möglichkeiten, dies zu tun, aber die nützlichste ist die sprintf Funktion. Dies ist eine Version der bereits gesehenen Funktion printf, die beliebigen Text in Zeichenfolgenvariablen schreibt. Der einzige Unterschied besteht darin, dass das erste Argument der Name einer String-Variablen ist und in diese anstatt in das Terminal geschrieben wird:

#include <stdio.h> void main (void) { int val = 12; char string[50]; sprintf (string, "Der Wert von val ist %d\n", val); printf ("%s", string); }

Die sprintf Funktion fügt am Ende jeder Zeichenfolge, die sie damit erstellen, automatisch die abschließende Null hinzu.

Im nächsten Kapitel werden einige der Funktionen in der String-Handhabungs Libary von C vorgestellt, um die Arbeit mit Strings zu vereinfachen.

Zurück zum Inhalt Vorige Seite Nächste Seite