C-Tutorial Kapitel 7


Aus Wirthi's Wiki

Wechseln zu: Navigation, Suche
C-Tutorial
Allgemeines
Kapitel 1 (Einleitung)
Kapitel 2 (Blöcke)
Kapitel 3 (Daten)
Kapitel 4 (Kontrollanweisungen)
Kapitel 5 (Ein- und Ausgabe)
Kapitel 6 (Unterprogramme)
Kapitel 7 (Felder und Strukturen)
Kapitel 8 (Zeiger)

Inhaltsverzeichnis

Das 7. Kapitel des C-Tutorials stellt einige besondere Datentype wie Felder und Strukturen vor.

[bearbeiten] Felder

Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt etwa ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Felder, sogenannte Arrays zu verwenden.

In einem Feld werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen, mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Feld mit etwa einer for-Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen Zahl_001 bis Zahl_100 arbeiten. Ein ihnen bereits bekanntes Beispiel für ein Feld ist ein String. Ein String ist nichts anderes als ein Feld des Datentypes char.

Syntax: Datentyp Variablenname[Anzahl]

Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden. In der eckigen Klammer wird die Anzahl der Elementer bekanntgegeben. Ein mit [3] definiertes Array hat 3 Variablen, nämlich [0], [1] und [2] (kein [3], da immer mit [0] begonnen wird). Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die "Nummer") der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes.

#include <stdio.h>

void main(void)
{
  int Zaehler;
  int Zahlen[10];  //Zahlen[0] bis Zahlen[9] !!!
  for (Zaehler=0; Zaehler<10; Zaehler++)
  {
    printf("Bitte Zahl %d eingeben: ",Zaehler);
    scanf("%d",Zahlen[Zaehler]);
    printf("\n");
  }
  printf("Danke!\n");
  for (Zaehler=0; Zaehler<10; Zaehler++) printf("Zahl %d war: %d",Zaehler,Zahlen[Zaehler]);
}
Erklärungen

Zuerst wird ein 10 int-Variablen großes Feld angelegt.

  • In dieses wird nun der Reihe nach 10 Zahlen eingelesen.
  • Anschließend werden alle 10 Zahlen ausgegeben.

ACHTUNG: Wenn Sie einen ungültigen Index angeben (einen, der in der Deklaration nicht enthalten war) können je nach Compiler und Einstellung mehrere Dinge geschehen: entweder liefert der Compiler einen Bereichsüberschreitungs-Fehler, oder das Programm funktioniert nicht oder falsch. Im schlimmsten Fall könnte sogar der Computer abstürzen. Also achten Sie darauf, dass Sie keine ungültigen Werte als Index angeben!

[bearbeiten] Mehrdimensionale Felder

Manchmal benötigt man mehr als nur ein ein-dimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammernhintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein char feld[1024][1024] hat die üblichen Speicherplatzgrenzen unter DOS bereits weit überschritten. Der Compiler wird hier einen Fehler liefern, außer dies ist ausgeschaltet.

Beim Zuweisen von Werten etc. müssen Sie bei mehrdimensionalen Feldern auch mehr als einen Index angeben, die Erklärung folgt als Beispiel:

#include <stdio.h>

void main(void)
{
  int x,y;
  int feld[3][5];

  for(x=0; x<3; x++) for (y=0; y<5; y++)
  {
    printf("Feldwert X: %d Y: %d",x,y);
    scanf("%d",feld[x][y]);
    printf("\n");
  }

  for(x=0; x<3; x++) for (y=0; y<5; y++) printf("Wert: feld[%d][%d]= %d\n",x,y,feld[x][y]);
}
Beschreibung
  • Zuerst wird ein 3 mal 5 int Array angelegt.
  • Dann werden die Werte eingegeben: zuerst feld[1][1], dann feld[1][2], usw. bis feld[3][5].
  • Zum Schluß werden alle Werte noch einmal ausgegeben.

[bearbeiten] Strings

Im Kapitel Variablen und Datentypen haben Sie bereits etwas von Strings gehört. Mit dem nun erworbenen Wissen über Felder und Unterprogramme sind Sie nun bereit für eine ausführlichere Erklärung.

Bei Strings handelt es sich um Felder vom Typ char. Wenn Sie einen String definieren, müssen Sie das mittels char machen:

char string[21];

Nun haben Sie eine string, in dem Sie 21 Zeichen speichern können. Davon können Sie aber nicht alle frei nutzen. C arbeitet mit sogenannten null-terminierten Zeichenketten. Das bedeutet, dass die Länge des Strings nicht separat abgespeichert wird, sondern ein Zeichen innerhalb des Strings das Ende desselben angibt. Es ist dies der Wert 0 (daher der Name "null terminiert"). Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende. Wenn Sie versuchen, einen solchen String auszugeben, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher (im Beispiel) nicht 21, sondern nur 20 Zeichen "netto" zur Verfügung.

[bearbeiten] strcpy

Sie können einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie die Prozedur strcpy benutzen. Diese erwartet als ersten Parameter eine String-Variable (ohne eckige Klammern) und als zweiten Parameter einen String. Dieser String kann sein: eine andere String-Variable oder ein in doppelten Hochkommas (") eingeschlossener Text. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren.

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

void main(void)
{
  char stri1[21],eingabe[21];
  strcpy(stri1,"hallo");
  printf("Der 1. String: %s\n",stri1);
  printf("Bitte geben Sie maximal 20 Zeichen ein: ");
  scanf("%s",eingabe);
  strcpy(stri1,eingabe);
  printf("\n %s = %s",stri1,eingabe);
  getch();
}
Hinweis
  • Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, brauchen Sie kein & bei scanf angeben!
Erklärung
  • Es werden zwei gleich große Strings definiert: stri1 und eingabe, mit je 20 "nutzbaren" Zeichen.
  • stri1 wird der Wert "hallo" zugewiesen. Das 0-Zeichen wird automatisch angefügt!
  • Der String wird ausgegeben. Als neues "Sonderzeichen" kommt %s ins Spiel. Es hat die gleiche Aufgabe wie %d oder %c, nur halt für Strings.
  • Sie werden gebeten, eine String einzugeben.
  • Dieser String wird danach in die Variable stri1 kopiert.
  • Beide Strings (die ja auch den selben Wert haben) werden ausgegeben.

[bearbeiten] strlen

Die Funktion strlen, die als Parameter eine String-Variable erwartet, liefert die Länge diese Strings zurück. Es sind dies die tatsächlich verwendeten Zeichen, also die Anzahl der Zeichen bis zur null-Terminierung. Dieses 0-Zeichen steht am Ende der gültigen Zeichenfolge steht, nicht unbedingt aber am Ende des reservierten Speicherplatzes. Haben Sie eine Variable "char Variable[21];" und ihr den Wert "hallo" zugewiesen, dann steht das null-Zeichen in Variable[5]. Der "gültige" String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern.

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

void main(void)
{
  char stri[21];
  strcpy(stri,"hallo");
  printf("Der String ist %d Zeichen lang", strlen(stri) );
  getch();
}

Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels stri[0], stri[1], etc.

[bearbeiten] Strukturen

In C können Sie sogenannte "Strukturen" definieren. Dabei handelt es sich um eine Zusammenfassung von mehreren Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen jedoch unterschiedliche Datentypen gespeichert werden. Denken Sie etwa an eine Person. Dafür könnten Sie etwa den Vornamen, den Nachnamen, die Telefonnummer und das Alter speichern wollen. Während die ersten drei Daten Zeichenketten sind, ist das letzte ein int-Wert.

struct {
  char vname[20],nname[20];
  char telnr[15];
  int alter;
} PERSON;

PERSON hubert;
PERSON stefan;
Erklärung

"struct {" leitet die Definition einer Struktur ein.

  • Dann werden vier Variablen angelege: drei Strings und ein int.
  • mit "}" wird der Block wieder geschlossen, anschließend muss der Struktur ein Name zugewiesen werden (etwa PERSON). Sie haben damit einen Datentyp erstellt. Um eine Variable dieses Typs (PERSON) anzulegen, geben Sie einfach "PERSON Variablenname;" an.

Hinweis: Dass der Datentyp mit Großbuchstaben geschrieben wird, ist nicht notwendig. Dies wird aber oft bei Strukturen gemacht, um Strukturen und Variablen einfacher unterscheiden zu können.

Wie spricht man die einzelnen Variablen einer Struktur nun an? Das funktioniert so:

  • Zuerst gibt man die Struktur-Variable an, im Beispiel "hubert" oder "stefan".
  • Danach schreibt man einen Punkt.
  • Zum Schluß folgt die gewünschte Variable, also etwa vname.

Die Anwendung von Strukturen verdeutlicht folgendes Beispiel (Typen und Variablendeklaration des letzten Beispieles dazudenken!):

strcpy(hubert.Vorname,"Max");
strcpy(Person1.Nachname,"Mustermann");
Allgemeines - Kapitel 1 - Kapitel 2 - Kapitel 3 - Kapitel 4 - Kapitel 5 - Kapitel 6 - Kapitel 7 - Kapitel 8

Persönliche Werkzeuge