Können alle Zeichenfolgen als Zeichenarray betrachtet werden ( Ja ), können alle Zeichenarrays als Zeichenfolgen betrachtet werden ( Nein)? )?
Warum nicht? und warum ist das wichtig?
Zusätzlich zu den anderen Antworten, die erklären, dass die Länge einer Zeichenfolge nirgendwo als Teil der Zeichenfolge gespeichert ist, und den Verweisen auf den Standard, in dem eine Zeichenfolge definiert ist, lautet die Kehrseite: "Wie behandeln die Funktionen der C-Bibliothek Zeichenfolgen?"
Während ein Zeichenarray dieselben Zeichen enthalten kann, handelt es sich lediglich um ein Zeichenarray, es sei denn, auf das letzte Zeichen folgt das nicht abschließende Zeichen. Das nicht endende Zeichen ermöglicht es, das Array von Zeichen als Zeichenfolge zu betrachten (zu behandeln).
Alle Funktionen in C, die eine Zeichenfolge als Argument erwarten, erwarten, dass die Zeichenfolge nicht abgeschlossen wird . Warum?
Dies hängt mit der Funktionsweise aller Zeichenfolgenfunktionen zusammen. Da die Länge nicht Teil eines Arrays ist, scannen Zeichenfolgenfunktionen im Array vorwärts, bis das Nullzeichen (z. B. '\0'
- entspricht der Dezimalzahl 0
) gefunden wird. Siehe ASCII-Tabelle und Beschreibung . Egal , ob Sie mit strcpy
, strchr
, strcspn
, etc .. Alle verlassen String - Funktionen auf dem nul-Abschluss anwesend Charakter zu definieren , wo das Ende dieser Zeichenfolge ist.
Ein Vergleich zweier ähnlicher Funktionen aus string.h
wird die Bedeutung des nicht terminierenden Zeichens hervorheben . Nehmen Sie zum Beispiel:
char *strcpy(char *dest, const char *src);
Die strcpy
Funktion kopiert einfach Bytes von src
bis, dest
bis das nicht abschließende Zeichen gefunden wird, das angibt , strcpy
wo das Kopieren von Zeichen beendet werden soll. Nehmen Sie nun die ähnliche Funktion memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
Die Funktion führt eine ähnliche Operation aus, berücksichtigt oder erfordert jedoch nicht, dass der src
Parameter eine Zeichenfolge ist. Da memcpy
beim src
Kopieren von Bytes nicht einfach vorwärts gescannt werden kann, dest
bis ein nicht abschließendes Zeichen erreicht ist, ist eine explizite Anzahl von Bytes zum Kopieren als dritter Parameter erforderlich. Dieser dritte Parameter liefert memcpy
mit der gleichen Größe Informationen strcpy
, die einfach durch Vorwärtsscannen abgeleitet werden können, bis ein nicht terminierendes Zeichen gefunden wird.
(was auch betont, was in strcpy
(oder einer Funktion, die eine Zeichenfolge erwartet) schief geht, wenn Sie der Funktion keine nicht terminierte Zeichenfolge zur Verfügung stellen - sie hat keine Ahnung, wo sie anhalten soll, und rast glücklich über den Rest Ihres Speichersegments davon Aufrufen von undefiniertem Verhalten, bis ein Nullzeichen zufällig irgendwo im Speicher gefunden wird - oder ein Segmentierungsfehler auftritt)
Aus diesem Grund muss Funktionen, die eine nicht terminierte Zeichenfolge erwarten, eine nicht terminierte Zeichenfolge übergeben werden, und warum dies wichtig ist .
char str[] = "hello";
Fall erwähnen .