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/ ) weiß ich, 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."
quelle
"CS"
einige Bytes Müll angehängt sind (in diesem Fall ist das letzte NUL-Zeichen irrelevant). Aber es ist keine Zeichenfolge "als Ganzes". - Wenn Sie dies jedochstrcpy
usw. zuführen, wird Ihr PC nicht explodieren, da diese Funktionen nur den"CS"
Teil "sehen" .strcmp()
. Ob es als Argument für die Mutation von Zeichenfolgenfunktionen verwendet werden kann, hängt von zusätzlichen Faktoren ab, die nicht angegeben werden.c1
ist veränderlich, daher verstehe ich nicht, warum es kein gültiges Zielargument fürstrcpy
oder ähnliches sein würde, es sei denn, es war nicht groß genug, um die Quellzeichenfolge aufzunehmen. Das würde es nicht zu einer Saite machen, nur nicht zu einer für einen bestimmten Zweck geeigneten.c1
würde die grundlegenden Anforderungen für Zeichenfolgenargumente für alle (engen) Zeichenfolgenfunktionen der Standardbibliothek erfüllen, einschließlich aller speziell genannten, aber das Verhalten entspricht möglicherweise nicht den Erwartungen oder Wünschen des Aufrufers (selbst wenn undefinierte Verhaltensweisen ignoriert werden, die hervorgerufen werden könnten).char
. Jeder Zeichentyp reicht aus .Antworten:
c1
ist meistens [1] äquivalent zu&c1[0]
, was eine Zeichenfolge enthält ,"CS"
.Es gibt eine zweite Zeichenfolge dort lauert,
"324"
am Start&c1[3]
- aber solange Sie Zugriff aufc1
wiec1
die Zeichenfolge"CS"
ist es, alle Funktionenstrcpy()
et al. würde sehen.[1]:
c1
ist ein Array,&c1[0]
ist ein Zeiger.quelle
c1
als Zielzeichenfolge in einemstrcpy()
Befehl zu verwenden? Die Frage ist mehrdeutig - bestenfalls.c1
als Argument für beide verwendenstrcpy()
. Es ist in jeder Hinsicht eine ganz normale Saite. Gewöhnliche Zeichenfolgen enthalten nach ihren Terminatoren häufig Restmüll. Die Tatsache, dass dieser Müll im Programm fest codiert ist, erweckt den Eindruck, dass der Autor beabsichtigt, ihnc1
ohne Zeichenfolgen zu verwenden, aber das war nicht Teil der Frage.c1
ist gleichbedeutend mit&c1[0]
" irreführend.c1
ist ein Array.&c1[0]
ist ein Zeiger.Wenn Sie die Besonderheiten der Definition einer Zeichenfolge in C kennen möchten, gehen Sie zur Quelle.
Aus dem C90-Standard :
(Es gab keine relevanten Änderungen in späteren Standards.)
Somit
c1
enthält zwei aufeinanderfolgende Strings „CS“ und „324“, ist aber nicht selbst ein String.Wenn wir ein Array an eine Funktion übergeben, zerfällt es in einen Zeiger auf sein erstes Element und zeigt somit
+c1
auf eine Zeichenfolge (die erste), 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.quelle
+c1
zeigt auf eine Zeichenfolge, dac1
mit einer Zeichenfolge beginnt. Das macht jedoch in keiner Weise, Form oder Gestaltc1
einen String.Als Ergänzung zu @ DevSolar's Antwort entdeckte ich etwas, nachdem ich mit der angegebenen Zeichenfolge herumgespielt hatte, wenn es so wäre:
Wenn Sie diese Zeichenfolge ausgeben, erhalten Sie
CS03240
und die Größe dieser Zeichenfolge ist 7. Nach meinem Verständnis\\0
wird verwendet, um das Nullzeichen ( dh\0
) zu bezeichnen. Wenn Sie tun:Sie sehen nichts im Ausgabeprotokoll, aber wenn Sie dies tun:
Sie sehen ein
\0
, etwas, das erwartet wird, weil Sie ein Sonderzeichen verwenden müssen, um Sonderzeichen wie Backslashes oder Anführungszeichen auszugeben\
.Was mich verwirrt, ist die Ausgabe
CS03240
und die 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 beträgt 7, auch für die Zeichenfolgechar c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
.Also vielleicht eine Antwort auf diese Frage, was ist hier los?
quelle
'\\0'
ist kein Nullzeichen . Es ist eine Konstante mit mehreren Zeichen. Es hat einen implementierungsdefinierten Wert, der sicherlich außerhalb des Bereichs von liegtchar
.c1[]
ist keine Zeichenfolge, da kein Nullzeichen vorhanden ist . "Sie geben diese Zeichenfolge aus" führt wahrscheinlich zu undefiniertem Verhalten .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
ist Größe 7, da es mit 7 Werten initialisiert wird. Die Größe hat nichts mit Strings zu tun .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
würde es immer noch Größe 7 machen.c1
einen Stich? Das ist ein separates Thema. Siehe auch