Kapitel acht - Die String Libary

Verwenden der C String Bibliothek (Libary) zur Vereinfachung allgemeiner Operationen an Strings.

Im vorherigen Kapitel haben wir gesehen, wie Sie mit Hilfe von Pointern (Zeigern) auf Zeichenfolgen zugreifen. Dies funktioniert einwandfrei und gibt Ihnen ein gutes Verständnis für die Funktionsweise von Pointern, ist jedoch etwas langwierig. Glücklicherweise bietet C eine Bibliothek mit nützlichen String Libary, die viel Eingabe sparen!

[BLEIB INNERHALB DEINES STRINGS] Die Funktionen der String Libary hindern Sie im Allgemeinen nicht daran, das Ende einer Zeichenfolge zu streichen. Genau wie bei der Verwendung von Pointern müssen Sie bei der Verwendung von Bibliotheksfunktionen sicherstellen, dass Ihre String Variablen groß genug für die Werte sind, in die Sie sie schreiben.

Im letzten Kapitel haben wir gesehen, wie zwei Zeichenfolgen mithilfe von Pointern miteinander verbunden werden. Wir werden dasselbe mit der String-Handling-Libary tun. Hier ist der Code, der mit Hilfe der Funktionen der String Libary neu geschrieben wurde:

#include <stdio.h> #include <string.h> void main (void) { char str1[10] = "erster"; char str2[10] = "zweiter"; char str3[20]; strcpy (str3, str1); strcat (str3, str2); printf ("%s + %s = %s\n", str1, str2, str3); }

Das ist viel kürzer! Beachten Sie am Anfang das #include <string.h>, das dem Compiler mitteilt, dass Funktionen aus der String-Libary verwendet werden sollen. Dies zeigt uns zwei String-Funktionen.
strcpy (string copy) kopiert den String beim zweiten Argument an den Anfang des Strings beim ersten Argument.
strcat (string concatenate) macht dasselbe, aber anstatt zum Anfang des ersten Arguments zu kopieren, findet es die abschließende Null des ersten Arguments und beginnt mit dem Kopieren an seine Position, wodurch die beiden Strings miteinander verbunden werden.

Strings vergleichen

Eine weitere häufige Anforderung besteht darin, zwei Zeichenfolgen vergleichen zu können, um festzustellen, ob sie identisch sind. Wie wir bereits gesehen haben, können wir numerische Werte mit dem Operator == vergleichen, dies funktioniert jedoch nicht mit Zeichenfolgen. Denken Sie daran, dass der Name einer Zeichenfolge eigentlich nur ein Zeiger auf eine Stelle im Speicher ist, die die Zeichenfolge enthält. Wenn Sie also == zum Vergleichen von zwei Zeichenfolgen verwenden, erfahren Sie nur, ob sie sich an derselben Stelle im Speicher befinden, nicht, wenn zwei Zeichenfolgen an unterschiedlichen Stellen im Speicher gleich sind.

Sie können == verwenden, um zwei Zeichenvariablen zu vergleichen, und eine Zeichenfolge ist ein Array von Zeichen. Sie können also einen einfachen Code schreiben, der jedes Zeichen in einer Zeichenfolge nacheinander vergleicht:

#include <stdio.h> void main (void) { char str1[10] = "first"; char str2[10] = "fire"; char *ptr1 = str1, *ptr2 = str2; while (*ptr1 != 0 && *ptr2 != 0) { if (*ptr1 != *ptr2) { break; } ptr1++; ptr2++; } if (*ptr1 == 0 && *ptr2 == 0) { printf ("Die zwei Strings sind gleich.\n"); } else { printf ("Die zwei Strings sind unterschiedlich.\n"); } }

Das Schreiben ist jedoch jedes Mal etwas mühsam, daher hat die Zeichenfolgenbibliothek dies mit der Funktion strcmp (string compare) für Sie erledigt. So verwenden Sie es:

#include <stdio.h> #include <string.h> void main (void) { char str1[10] = "first"; char str2[10] = "fire"; if (strcmp (str1, str2) == 0) { printf ("Die zwei Strings sind gleich.\n"); } else { printf ("Die zwei Strings sind unterschiedlich.\n"); } }

strcmp verwendet zwei Zeichenfolgen als Argumente und gibt eine 0 zurück, wenn sie identisch sind. Andernfalls wird ein Wert ungleich Null zurückgegeben.

Was ist, wenn Sie nur die ersten Zeichen einer Zeichenfolge vergleichen möchten, nicht die gesamte Zeichenfolge? Auch dafür gibt es eine Bibliotheksfunktion:

strncmp (string numbered compare).
Dies funktioniert genauso wie strcmp, es wird jedoch ein drittes Argument benötigt, eine Ganzzahl, die die Anzahl der zu vergleichenden Zeichen angibt. strncmp(„first“, „fire“, 4) würde also einen Wert ungleich Null zurückgeben, während strncmp(„first“, „fire“, 3) eine 0 zurückgeben würde.

[Ignorieren der Groß- & Kleinschreibung] Es gibt Versionen von strcmp und strncmp, die die Groß- & Kleinschreibung der Buchstaben in den zu vergleichenden Strings ignorieren. Sie werden als strcasecmp bzw. strncasecmp bezeichnet. Sie verwenden dieselben Argumente und geben dieselben Werte zurück.

Werte aus einem String lesen

Wir haben im vorherigen Kapitel gesehen, dass wir sprintf verwenden können, um Variablen in einen String zu schreiben. Was ist mit der Möglichkeit, Variablen wieder aus einem String zu lesen? Die Funktion sscanf (String Scan formatiert) erledigt das für Sie. So funktioniert das:

#include <stdio.h> void main (void) { int val; char string[10] = "250"; sscanf (string, "%d", &val); printf ("Der Wert des String's ist %d\n", val); }

sscanf verwendet genau die gleichen Formatbezeichner wie printf.

Ein wichtiger Unterschied ist jedoch, dass die Argumente für sscanf alle Pointer auf Variablen sein müssen und nicht auf Variablen selbst. Wie immer kann eine Funktion niemals die Werte von Variablen ändern, die als Argumente bereitgestellt werden, aber sie kann an ihre Ziele schreiben, wenn sie Pointer sind.

Sie können überprüfen, ob sscanf die Formatspezifizierer mit der angegebenen Zeichenfolge abgleichen konnte, indem Sie den zurückgegebenen Wert überprüfen. sscanf gibt die Anzahl der erfolgreich gelesenen Werte zurück. Wenn beispielsweise ein Formatbezeichner %d angegeben wird, die angegebene Zeichenfolge jedoch nicht mit einer Dezimalzahl beginnt, schreibt sscanf nichts in den angegebenen Zeiger und gibt 0 zurück. Wenn die angegebene Zeichenfolge mit einer Dezimalzahl beginnt, gibt sscanf 1 zurück.

$ ./string
Der Wert des String's ist 250
$

Oben: Die sscanf Library-Funktion wird hier mit dem Formatbezeichner %d verwendet, um den Dezimalwert 250 aus einer Zeichenfolge zu lesen.

Der an sscanf gelieferte Format-String kann mehrere Formatbezeichner und sogar anderen Text enthalten:

#include <stdio.h> void main (void) { int val; char result[10]; char string[25] = "Die erste Zahl ist 1"; if (sscanf (string, "Die %s Zahl ist %d", result, &val) == 2) { printf ("String: %s Zahl: %d\n", result, val); } else { printf ("Ich kann keine zwei Werte in diesem String finden.\n"); } }

Oben: sscanf liest numerische Werte und Wörter aus einem formatierten String, sodass Sie Text von einer anderen Stelle aus analysieren können. Denken Sie daran, dass alle Argumente für sscanf Pointer sein müssen.

[SSCANF STRINGS] Der %s-Formatbezeichner stimmt mit einer Reihe von Nicht-Leerzeichen in sscanf überein. Der erste Satz von Buchstaben, Zahlen oder Satzzeichen wird bis zum ersten Leerzeichen, Tabulator oder Zeilenumbruch im gescannten String extrahiert. Ein Leerzeichen im formatierten String entspricht einem oder mehreren Leerzeichen, nicht nur einem einzelnen Leerzeichen.

Beachten Sie, dass der Formatbezeichner %s, etwas inkonsistent, einen Zeiger auf eine Zeichenfolge in printf und sscanf Kennzeichnet, während der Bezeichner %d eine Variable in printf, aber einen Pointer in sscanf bezeichnet.

Bei sscanf ist zu beachten, dass es sich in der <stdio.h> (Standard-I/O-Libary) befindet und nicht in der <string.h> (String handling libary). Sie benötigen also nicht #include <string.h>, um sscanf zu verwenden.

Wie lang ist ein (Teil vom) String?

Eine letzte nützliche Funktion zur Handhabung von Strings ist strlen (string length). Wie der Name schon sagt, gibt dies an, wie viele Zeichen eine Zeichenfolge enthält, vom Anfang bis zum abschließenden Nullzeichen.

#include <stdio.h> #include <string.h> void main (void) { char str1[10] = "erster"; printf ("Die Länge des String '%s' ist %d\n", str1, strlen (str1)); }

Der Ordnung halber die Ausgabe des obigen Programms:

Die Länge des String 'erster' ist 6

Alle Operationen, die wir hier betrachtet haben, sind durch manuelles Bearbeiten von Zeigern möglich. Die String Libary erleichtert sie nur und verkürzt Ihren Code. Wenn Sie in einem Programm Pointer um Zeichenfolgen bewegen, überprüfen Sie immer die String Libary, um sicherzustellen, dass Sie das Rad nicht neu erfinden!