Zeiger auf Zeichen und Funktionsverwendung in C meistern
Was ist ein Zeichen-Zeiger in C?
Ein Zeichen-Zeiger speichert die Adresse eines Zeichentyps oder die Adresse des ersten Zeichens eines Zeichen-Arrays (Strings). Zeichen-Zeiger sind sehr nützlich, wenn Sie Strings manipulieren möchten.
In C gibt es keinen String-Datentyp. Ein Array vom Typ „char“ wird als String betrachtet. Daher stellt ein Zeiger auf ein char-Array einen String dar. Dieser char-Zeiger kann dann als Argument an eine Funktion übergeben werden, um den String zu verarbeiten.
Deklaration eines Zeichen-Zeigers
Ein Zeichen-Zeiger zeigt auf ein Zeichen oder ein Zeichen-Array. Um einen Zeichen-Zeiger zu deklarieren, verwenden Sie folgende Syntax:
char *zeiger_name;
Initialisierung eines Zeichen-Zeigers
Nach der Deklaration müssen Sie den Zeichen-Zeiger mit der Adresse einer Zeichen-Variable initialisieren. Handelt es sich um ein Zeichen-Array, können Sie den Zeiger einfach mit dem Namen des Arrays oder der Adresse des ersten Elements initialisieren.
Zeichen-Zeiger auf ein einzelnes Zeichen
Die Syntax zur Initialisierung eines Zeichen-Zeigers auf eine Zeichen-Variable:
char *zeiger_name = &char_variable;
Zeichen-Zeiger auf ein Zeichen-Array (String)
Die Syntax zur Initialisierung eines Zeichen-Zeigers auf ein Zeichen-Array:
char *zeiger_name = char_array; /*oder*/ char *zeiger_name = &char_array[0];
Beispiel für Zeichen-Zeiger
Im folgenden Beispiel haben wir eine Zeichen-Variable und ein Zeichen-Array. Zwei Zeigervariablen speichern die Adressen, und wir geben die Werte über die Zeiger aus.
#include <stdio.h>
int main() {
// Variablen deklarieren
char x = 'P';
char arr[] = "TutorialsPoint";
// Zeichen-Zeiger deklarieren
char *ptr_x = &x;
char *ptr_arr = arr;
// Werte ausgeben
printf("Wert von x : %c\n", *ptr_x);
printf("Wert von arr: %s\n", ptr_arr);
return 0;
}
Ausgabe
Führen Sie den Code aus und prüfen Sie die Ausgabe:
Wert von x : P Wert von arr: TutorialsPoint
Zeichen-Zeiger verstehen
Ein String wird als Array deklariert:
char arr[] = "Hallo";
Der String ist ein null-terminiertes Zeichen-Array. Das letzte Element ist das Null-Zeichen (\0).
Deklarieren Sie einen char-Zeiger und weisen Sie ihm die Adresse des Zeichens an Position 0 zu:
char *ptr = &arr[0];
Der Name des Arrays ist selbst die Adresse des 0. Elements:
char *ptr = arr;
Ein String kann auch direkt über einen Zeiger deklariert werden (ohne eckige Klammern):
char *ptr = "Hallo";
Dadurch wird der String im Speicher abgelegt und seine Adresse in ptr gespeichert. Wir können den String durch Inkrementieren von ptr durchlaufen:
while(*ptr != '\0') {
printf("%c", *ptr);
ptr++;
}
Zugriff auf Zeichen-Arrays
Wenn Sie ein Zeichen-Array mit dem Formatbezeichner %s ausgeben, können Sie einfach den Namen des Zeichen-Zeigers verwenden. Um jedoch auf jedes einzelne Zeichen zuzugreifen, müssen Sie ein Sternchen (*) vor den Zeigernamen setzen und diesen dann inkrementieren.
Beispiel
Hier ist der vollständige Programmcode:
#include <stdio.h>
int main() {
char arr[] = "Zeichen-Zeiger und Funktionen in C";
char *ptr = arr;
while(*ptr != '\0') {
printf("%c", *ptr);
ptr++;
}
}
Ausgabe
Führen Sie den Code aus und prüfen Sie die Ausgabe:
Zeichen-Zeiger und Funktionen in C
Alternative Ausgabe mit %s
Alternativ können Sie ptr an printf() mit %s übergeben, um den String auszugeben.
#include <stdio.h>
int main() {
char arr[] = "Zeichen-Zeiger und Funktionen in C";
char *ptr = arr;
printf("%s", ptr);
}
Ausgabe
Beim Ausführen erhalten Sie die gleiche Ausgabe:
Zeichen-Zeiger und Funktionen in C
Zeichen-Zeiger-Funktionen
Die Header-Datei „string.h“ definiert eine Reihe von Bibliotheksfunktionen zur String-Verarbeitung, wie das Ermitteln der String-Länge, das Kopieren und das Vergleichen von Strings. Diese Funktionen verwenden char-Zeiger als Argumente.
Die strlen()-Funktion
Die Funktion strlen() gibt die Länge eines Strings zurück, also die Anzahl der Zeichen. Der Prototyp lautet:
int strlen(char *)
Beispiel 1
Der folgende Code zeigt, wie Sie die Länge eines Strings ausgeben:
#include <stdio.h>
#include <string.h>
int main() {
char *ptr = "Hallo";
printf("Gegebener String: %s \n", ptr);
printf("Länge des Strings: %d", strlen(ptr));
return 0;
}
Die Ausgabe:
Gegebener String: Hallo Länge des Strings: 5
Beispiel 2: Benutzerdefinierte Implementierung
Im Grunde berechnet strlen() die Länge ähnlich wie die folgende benutzerdefinierte Funktion str_len():
#include <stdio.h>
#include <string.h>
int str_len(char *);
int main() {
char *ptr = "Willkommen bei Tutorialspoint";
int length = str_len(ptr);
printf("Gegebener String: %s \n", ptr);
printf("Länge des Strings: %d", length);
return 0;
}
int str_len(char *ptr) {
int i = 0;
while(*ptr != '\0') {
i++;
ptr++;
}
return i;
}
Ausgabe:
Gegebener String: Willkommen bei Tutorialspoint Länge des Strings: 25
Die strcpy()-Funktion
Der Zuweisungsoperator (=) wird nicht verwendet, um einem Zeichen-Zeiger einen String-Wert zuzuweisen. Stattdessen benötigen wir die Funktion strcpy() mit folgendem Prototyp:
char * strcpy(char * ziel, char * quelle);
Beispiel 1
Das folgende Beispiel zeigt die Verwendung von strcpy():
#include <stdio.h>
#include <string.h>
int main() {
char *ptr = "Wie geht es dir?";
char *ptr1;
strcpy(ptr1, ptr);
printf("%s", ptr1);
return 0;
}
Die Funktion strcpy() gibt den Zeiger auf den Zielstring ptr1 zurück.
Wie geht es dir?
Beispiel 2: Interne Logik
Intern implementiert strcpy() etwa folgende Logik in einer benutzerdefinierten Funktion str_cpy():
#include <stdio.h>
#include <string.h>
void str_cpy(char *d, char *s);
int main() {
char *ptr = "Verwendung der strcpy()-Funktion";
char *ptr1;
str_cpy(ptr1, ptr);
printf("%s", ptr1);
return 0;
}
void str_cpy(char *d, char *s) {
int i;
for(i = 0; s[i] != '\0'; i++)
d[i] = s[i];
d[i] = '\0';
}
Ausgabe:
Verwendung der strcpy()-Funktion
Die Funktion kopiert jedes Zeichen vom Quell- zum Zielstring, bis das Null-Zeichen „\0“ erreicht ist. Nach der Schleife fügt sie ein „\0“ am Ende des Ziel-Arrays hinzu.
Die strcmp()-Funktion
Die üblichen Vergleichsoperatoren (<, >, <=, >=, ==, !=) dürfen nicht zum Vergleichen zweier Strings verwendet werden. Stattdessen nutzen wir strcmp() aus „string.h“. Der Prototyp:
int strcmp(char *str1, char *str2)
strcmp() hat drei mögliche Rückgabewerte:
- Sind beide Strings identisch, wird 0 zurückgegeben.
- Hat das erste nicht übereinstimmende Zeichen in str1 einen größeren ASCII-Wert als das entsprechende in str2, wird eine positive Ganzzahl zurückgegeben. Das bedeutet, str1 steht alphabetisch hinter str2.
- Hat das erste nicht übereinstimmende Zeichen in str1 einen kleineren ASCII-Wert, wird eine negative Ganzzahl zurückgegeben. Das bedeutet, str1 steht alphabetisch vor str2.
Beispiel 1
Das folgende Beispiel demonstriert die Verwendung von strcmp():
#include <stdio.h>
#include <string.h>
int main() {
char *s1 = "BASK";
char *s2 = "BALL";
int ret = strcmp(s1, s2);
if (ret == 0)
printf("Beide Strings sind identisch\n");
else if (ret > 0)
printf("Der erste String steht hinter dem zweiten String\n");
else
printf("Der erste String steht vor dem zweiten String\n");
return 0;
}
Ausgabe:
Der erste String steht hinter dem zweiten String
Ändern Sie s1 in „BACK“ und führen Sie den Code erneut aus. Die Ausgabe lautet nun:
Der erste String steht vor dem zweiten String
Beispiel 2: Benutzerdefinierte Implementierung
Ein ähnliches Ergebnis erzielt die benutzerdefinierte Funktion str_cmp():
#include <stdio.h>
#include <string.h>
int str_cmp(char *str1, char *str2);
int main() {
char *s1 = "Das beste C-Programmier-Tutorial online";
char *s2 = "Das beste C-Programmier-Tutorial online";
int ret = str_cmp(s1, s2);
if (ret == 0)
printf("Beide Strings sind identisch\n");
else if (ret > 0)
printf("Der erste String steht hinter dem zweiten String\n");
else
printf("Der erste String steht vor dem zweiten String\n");
return 0;
}
int str_cmp(char *str1, char *str2) {
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
// Wenn beide Strings gleich sind, 0 zurückgeben
return 0;
}
Ausgabe:
Beide Strings sind identisch
Die Funktion str_cmp() vergleicht die Zeichen an gleicher Position, bis die Zeichen eines Strings erschöpft sind oder sie sich unterscheiden. Bei Ungleichheit wird die Differenz der ASCII-Werte zurückgegeben. Bei Abbruch der Schleife wird 0 zurückgegeben.
C Sprache
- Der C-Präprozessor (CPP) verstehen: Wie er die Kompilierung vereinfacht
- Rekursion in C meistern: Best Practices & Abbruchbedingungen
- Versiegelte Klassen und Methoden in C# meistern
- Zeiger in C: Umfassender Leitfaden zu Typen, Verwendung und Best Practices
- C Datei-E/A meistern: Dateien erstellen, öffnen, lesen, schreiben und schließen
- Bedingte Logik in C# meistern: If, If-Else, If-ElseIf und verschachtelte If-Anweisungen
- C# Zugriffsmodifizierer (Specifiers) verstehen: Mit praktischen Beispielen
- C# Static Keyword: Statische Variablen, Methoden und Klassen meistern
- C++ Standardfunktionsargumente: Funktionsweise & Best Practices
- C++ Vectors meistern: Dynamische Arrays, Iteratoren & Praxisbeispiele