Was ist der Unterschied zwischen einem Zeichenarray und einer C-Zeichenfolge?


Antwort 1:

Ein Array von Zeichen ist eine zusammenhängende Speicherspanne, die als 8-Bit-Bytes analysiert wird. Die Größe ist bei der Erstellung festgelegt und es wird garantiert, dass in jedem Byte ein Zeichen gespeichert wird.

Ein Zeichen ist in diesem Fall eine beliebige 8-Bit-Binärziffer von 00000000 (0x00 hex) bis 11111111 (0xFF hex).

char array [100]; / * 100 Zeichen Array [0] bis Array [99] * /

Ein C-String verwendet ein char-Array zur Speicherung. Ein C-String kann von 0 bis zur Länge des Arrays minus 1 Zeichen lang sein.

Um wohlgeformt zu sein, darf das Array nur eine Teilmenge von Bytes enthalten, die gültige Symbole in dem zu verwendenden Zeichensatz darstellen. Oft ist dies ASCII oder UTF-8. Alle anderen Bytes sind möglicherweise nicht gültig, wenn die Zeichenfolge gedruckt oder interpretiert wird.

Die Zeichenfolge hat eine Bezeichnung (Variable), bei der es sich um einen Zeichenzeigertyp (char *) handelt, der die Adresse des Arrays enthält.

Die Zeichenfolge hat ein NULCHAR ('\ 0', 0x00 hex), das die Zeichenfolge nach dem letzten Zeichen der Zeichenfolge beendet.

char s [10]; char * t = & s; strncpy (t, "012345678 \ 0", 10)

Eine 'sofortige Zeichenfolge' wird im Quellcode in doppelte Anführungszeichen geschrieben und bewirkt, dass ein Zeichenarray mit den ausgefüllten Zeichen erstellt und an einem speziellen Nur-Lese-Speicherort für Zeichenfolgen abgelegt wird und ein Zeiger darauf zurückgegeben wird. Dies ist „Syntaxzucker“ des Compilers und vereinfacht die Verwendung solcher Zeichenfolgen. Ein NULCHAR wird automatisch an das Array angehängt, um es zu einer wohlgeformten Zeichenfolge zu machen.

char * s = "eine sofortige Zeichenfolge"; printf ("% s \ n), s);

Alle Standardfunktionen der C-Bibliothekszeichenfolge übergeben Zeichenfolgen als Zeichen und setzen voraus, dass '\ 0' vorhanden ist.

Ein "Hack", der ziemlich universell verwendet wird, ist, dass die Bezeichnung eines Arrays beim Zugriff gleichzeitig als Zeiger auf das erste Element des Arrays dient. und umgekehrt.

char * x = "abcdefgh"; printf ("x 4. Zeichen:% c \ n", x [3]); x 4. Zeichen: d / * einen String in ein Zeichenarray einfügen * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18); char * a = str; char * b = str + 7; printf ("% s \ n", a); abcdefghijklmnop printf ("% s \ n", b); hijklmnop

Trotz dieser Flexibilität sind ein char-Array und ein C-String nicht direkt kompatibel.

char s [10]; s = "abcdefghi"; / * error * / // error: Inkompatible Typen bei Zuweisung zum Typ 'char [10]' vom Typ 'char *' "abcdefghi" ist eine unmittelbare Zeichenfolge und wird in einen Zeiger auf 'a' in dem dafür erstellten Array aufgelöst. Das Zuweisen von s funktioniert nicht, da char-Arrays nicht zugewiesen werden können.

Arrays sind in C nicht wirklich ein erstklassiger Typ. Sie können nicht direkt kopiert werden, sie haben keine Operationen auf Array-Ebene usw. Alles, was mit Arrays in C gemacht wird, wird für den einzelnen Inhalt gemacht, nicht als Einheit.

char s [10]; char * x = "abcdefghi"; / * '\ 0' steht am Ende * / strncpy (s, x, 10); / * kopiert jedes Zeichen in ein Array * /

Antwort 2:

Ein Zeichenarray ist eine Datenstruktur in der Programmiersprache C: eine Anzahl von Bytes im Speicher, in denen Sie Zeichen speichern können. Sie können in jeder dieser Zellen ein beliebiges Zeichen (dh 8-Bit-Bytes, Wert 0 bis 255) speichern.

Eine Zeichenfolge im C-Stil (wie ich in Ihrer Frage „c-Zeichenfolge“ interpretiere) ist eine Möglichkeit, eine „Zeichenfolge“ von Zeichen darzustellen, die von der C-Sprache als eine Anzahl von Zeichen ohne das Nullbyte (Wert) definiert wird 0). Dies wird durch die Zeichen selbst dargestellt, gefolgt von einem Null-Byte, sodass die Länge der Zeichenfolge nicht separat gespeichert werden muss. Vergleichen Sie dies mit der Zeichenfolge im Pascal-Stil, bei der sie durch eine 16-Bit-Ganzzahl ohne Vorzeichen gefolgt von dieser Anzahl von Informationsbytes dargestellt wird (sodass die Länge der Pascal-Zeichenfolge höchstens 65535 beträgt).

Das Zeichenarray ist also eine Datenstruktur, die Zeichenfolge im C-Stil ist die Datendarstellung. Sie sind verschiedene Tiere.

Ein Zeichenarray kann eine Zeichenfolge im C-Stil oder etwas anderes enthalten (z. B. enthält es nützliche Informationen nach dem Nullzeichen oder enthält überhaupt kein Nullzeichen). und trotzdem können Sie es möglicherweise trotzdem als Zeichenfolge im C-Stil interpretieren (solange es mindestens ein Nullzeichen enthält). Eine Zeichenfolge im C-Stil kann in einem Zeichenarray oder an einem anderen Ort als einem Array gespeichert sein (z. B. einem schreibgeschützten Teil des Speichers und kann daher keine anderen Werte „speichern“).