Programmieren
 
 
 
 
 
C-Grundkurs
 
 
 
 
 
.. nullterminierte Strings
 
 

 
 
 
 
 
Den Begriff String würde man im deutschsprachigen Raum mit Zeichenfolge übersetzen. Zeichen sind dabei alle Bildchen die wir malen, wenn wir behaupten, dass wir schreiben oder Rechnen. Also die Buchstaben, Zahlen und Sonderzeichen die bereits in der ASCII Code-Tabelle aufgeführt wurden. In der Computertechnik kommen hier noch die Steuerzeichen hinzu.
Da sich Computer diese Bildchen nicht merken können, sondern nur Zahlen, noch genauer Spannungen, die in der Form 0,1 beschrieben werden, wurden den Zeichen Codezahlen zugeordnet. (s.ASCII Code-Tabelle) Die Zahl 0 besitzt hierbei eine besondere Bedeutung, denn sie schließt bei nullterminierten (mit 0 beendeten) Strings die Zeichenfolge ab.

 

 
 

 

 
Durch die folgende C-Zeile kann man den Compiler auffordern für das angegebene Zeichen den ASCIIcode herauszusuchen und in die angegebene Speicherzelle zu übertragen ..
           char zeichen= 'A';

Im Speicherbyte mit der Adresse zeichen würde nun als Inhalt der ASCIIcode des Zeichens A = 0x41 stehen. Natürlich könnte man den ASCIIcode auch selber heraussuchen und ihn als dezimale, oktale oder hexadezimel Zahl in der obigen Befehlszeile angeben, aber es ist einfacher, dies den Compiler tun zu lassen.

Als String wird in C eine Abfolge von aufeinander folgenden Seicherinhalten bezeichnet, die sich zu einer Zeichenfolge ergeben, wenn man die Zahlen, welche den Inhalt der Speicherbytes bilden, als ASCIIcode interpretiert. Besteht der Inhalt des letzten Speicherbytes aus der Zahl 00h, dann spricht man von einem nullterminierten String. Diese werden in C ausschließlich verwendet. Ein Beispiel ist ..

           char  string1[] = {'A','b','C','\0'};

In diesem Beispiel werden 4 Speicherbytes mit Code aus der ASCII-Tabelle gefüllt, wobei das letzte Byte durch das Ersatzzeichen \0 den Inhalt 00h erhält. Der Schreibaufwand lässt sich erheblich verringern, wenn man anstelle der Aufzählung aller Einzelelemente des Strings plus Nullterminierung, “Gänsefüsschen“ benutzt.

           char  string1[] = "AbC";
           char* string2   = "AbC";

Diese haben zudem den Vorteil, dass die den String abschliessened 0 nicht geschrieben werden muss sondern automatisch angehängt wird. Bemerkenswert ist, dass bei Strings zwei verschieden Schreibweisen zugelassen sind, aber davon später bei den Arrays.
Weiterhin ist interessant, dass man auf jeden der Buchstaben zugreifen kann, indem man z.B. schreibt ..

           char c;
           c= string1[0];   // oder
           c= string2[0];

.. in beiden Fällen wäre die Variable c mit dem ASCIIcode für A=0x41 gefüllt worden. Will man auf die Nullterminierung zugreifen, so gelingt das durch ..

           c= string1[3];   // oder
           c= string2[3];

..nun hätte c den Wert 0.

 

 


 

 
 
 
 
Beispiel 1:
Bleibt die Frage was man davon hat, wenn man Strings nicht gleich zum Bildschirm ausgibt, wie es mit printf() ja schon geschah, sondern in einer Variablen aufhebt. Nun ja, man kann sie unter Programmkontrolle verändern, oder sie zuvor durch Tastatureingaben zusammenstellen. Das nachfolgende Programm holt sich ein Zeichen von der Tastatur und setzt es in einen String ein ..
 
#include <stdio.h>
#include <conio.h>

void main(void)
{
 char string[]= "Das Zeichen ? wurde eingegeben";
 
 string[12] = getch();
 printf("\r\n %s", string);
}

// Dieses Programm wartet mit der Funktion getch() auf eine Eingabe
// von der Tastatur. Erfolgt eine Eingabe, so wird der ASCIIcode
// von der Tastatur an der Position 12 in die Zeichenfolge string
// eingefügt. Nun wird die gesamte Zeichenfolge an der
// Einfügestelle %s des printf()-Formatierungsstrings eingesetzt
// und ausgegeben.
// Angenommen es wurde die Taste [1] gedrückt, so erscheint wegen
// \r\n, auf einer neuen Zeile des Bildschirms, die Ausgabe ..

// Das Zeichen 1 wurde eingegeben
 
 
 

 


 

 
Beispiel 2:
Merkt man sich zudem, dass es möglich ist, sich mit ..

char string[20];              // Achtung normale Zählung ..
                              // .. beim Zugriff Zählung von 0-19

.. 20 Bytes im Hauptspeicher zu reservieren in welchen Tastatureingaben abgelegt werden können, und dass diese mit 0 beginnend gezählt werden, ( die Bytes tragen also die Nummern 0-19) so kann man sich eine Funktion erstellen, die einen String von der Tastatur sammelt ..
 

 

#include <stdio.h>
#include <conio.h>

#define CR 0x0D                 // CR steht für den ASCIIcode von
                                // Carriage Return 
#define max 20                  // max steht für die Zahl 20

void main(void)
{
 char string[max+1];            // 21 Bytespeicher bereitstellen
 char n;                        // Hilfsvariable
 
 for(n=0; n<max; n++){          // maximal n<20 Zeichen holen
   string[n] = getch();         // auf einen Tastendruck warten
   if(string[n]== CR) break;    // wenn das ein CR war, Ende for()
   printf("%c",string[n]);      // sonst Zeichen ausgeben
 }

 string[n]=0;                   // String nullterminieren
 printf("\r\n %s", string);     // und ausgeben
 getch(); 
}

// Zu beachten ist bei dem Beispiel, dass einmal mit ..
// printf("%c",string[n]); ein einzelnes Zeichen und mit ..
// printf("\r\n%s", string); der ganze nullterminierte String
// ausgegeben wird
// Zudem wurde die Präprozessordirektive #define verwendet, um die
// Zahlen 20 und 0x0D mit den Namen max und CR beschreiben zu
// können. Das ist manchmal einfacher, als sich die Zahlen zu
// merken. Grundsätzlich hätte man dort wo die Namen stehen, auch
// die Zahlen schreiben können.

// Das der angeforderte Bytespeicher aus 21 (max+1) Bytes besteht,
// ergibt sich aus der Notwendigkeit nach 20 Zeichen noch die 0 für
// die Nullterminierung in dem Speicher unterbringen zu müssen. 

 

 

 

www..de