Ich soll eine Hausaufgabenfrage für eine meiner Klassen beantworten. Insbesondere soll ich sagen, ob bestimmte Arrays in C als Strings betrachtet werden oder nicht. Basierend auf diesem Artikel (https://www.geeksforgeeks.org/strings-in- c-2 /) Ich weiß, dass Zeichenfolgen ein Array von Zeichen mit dem Nullterminator am Ende sind.

Mein Hauptproblem ist ein Teil der Frage, die nach einem Array fragt, das so aussieht:

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

Dies ist offensichtlich ein Array von Zeichen mit einem Null-Abschlusszeichen am Ende. Wird es jedoch immer noch als Zeichenfolge betrachtet, da es in der Mitte auch ein Null-Abschlusszeichen hat? Wie wirkt sich das auf die Zeichenfolge aus?

EDIT: Aufgrund von Kommentaren habe ich den tatsächlichen Wortlaut der Frage angegeben:

"Welche der folgenden Arrays können als" Zeichenfolgen "betrachtet werden, um sie als Argumente für strcpy (), strncpy (), strcmp (), strncmp () und ähnliche Zeichenfolgenfunktionen zu verwenden (geben Sie alle zutreffenden an)?"

EDIT: Ich habe meinem Professor eine E-Mail darüber geschickt, da die Frage nicht eindeutig formuliert zu sein schien (wie mehrere Leute betonten). Wenn jemand neugierig ist, sagte er zu mir: "Ja, es ist eine Zeichenfolge. Der Schlüssel ist, dass es ein Nullzeichen gibt. Aber das wirkt sich natürlich auf alle Zeichenfolgenoperationen aus. Die Zeichenfolge endet mit dem Nullzeichen."

11
quango 22 Feb. 2020 im 01:02

3 Antworten

Beste Antwort

c1 entspricht meistens [1] &c1[0], das eine Zeichenfolge enthält, "CS".

Dort lauert eine zweite Zeichenfolge, "324", beginnend bei &c1[3] - aber solange Sie als c1 auf c1 zugreifen, ist die Zeichenfolge "CS" alles die Funktionen strcpy() et al. würde sehen.


[1]: c1 ist ein Array, &c1[0] ist ein Zeiger.

8
DevSolar 22 Feb. 2020 im 10:13

Wenn Sie die Einzelheiten der Definition eines Strings in C kennen möchten, gehen Sie zur Quelle.

Aus dem C90-Standard:

7 Bibliothek

7.1 Einführung

7.1.1 Begriffsdefinitionen
Eine Zeichenfolge ist eine zusammenhängende Folge von Zeichen, die mit dem ersten Nullzeichen abgeschlossen sind und dieses enthalten. Ein "Zeiger auf" eine Zeichenfolge ist ein Zeiger auf das ursprüngliche Zeichen (niedrigste Adresse). Die "Länge" einer Zeichenfolge ist die Anzahl der Zeichen vor dem Nullzeichen und ihr "Wert" ist die Reihenfolge der Werte der enthaltenen Zeichen in der angegebenen Reihenfolge.

(Es gab keine relevanten Änderungen in späteren Standards.)

Somit enthält c1 zwei aufeinanderfolgende Zeichenfolgen, "CS" und "324", ist jedoch selbst keine Zeichenfolge.

Wenn wir ein Array an eine Funktion übergeben, zerfällt es in einen Zeiger auf sein erstes Element, sodass +c1 auf eine Zeichenfolge (die erste) zeigt, was für jede Funktion gut genug ist, die einen Zeiger auf eine Zeichenfolge erwartet. Es zeigt nicht auf eine Zeichenfolge "CS \ 0324", aber das ist wahrscheinlich gut genug für die Frage Ihrer Instruktoren, die nicht eindeutig ist.

2
Deduplicator 21 Feb. 2020 im 23:45

Als Ergänzung zu @ DevSolar's Antwort entdeckte ich etwas, nachdem ich mit der angegebenen Zeichenfolge herumgespielt hatte, wenn es so wäre:

char c1[] = { 'C', 'S', '\\0', '3', '2', '4', '\\0' };

Wenn Sie diese Zeichenfolge ausgeben, erhalten Sie CS03240 und die Größe dieser Zeichenfolge ist 7. Nach meinem Verständnis wird \\0 verwendet, um das Nullzeichen ( dh \0). Wenn Sie tun:

printf("\0");

Sie sehen nichts im Ausgabeprotokoll, aber wenn Sie dies tun:

printf("\\0");

Sie sehen ein \0, was erwartet wird, da Sie zur Ausgabe von Sonderzeichen wie Backslashes oder Anführungszeichen ein \ verwenden müssen.

Was mich verwirrt, ist die Ausgabe CS03240 und ihre Größe 7. Es ist allgemein bekannt, dass die Größe einer Zeichenfolge die Anzahl der darin enthaltenen Zeichen plus eins (für das Nullzeichen) ist. Auch die Größe ist 7 sogar für die Zeichenfolge, char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };.

Also vielleicht eine Antwort auf diese Frage, was ist hier los?

0
rasengan__ 22 Feb. 2020 im 04:41