Warum nicht numerischen arrays Ende mit einem '\0' oder null-Zeichen?
Warum nicht die numerische arrays Ende mit einem null-Zeichen?
Beispielsweise
char name[] = {'V', 'I', 'J', 'A', 'Y', '\0'};
Aber im Fall von numerischen arrays es ist kein Zeichen von null-Zeichen am Ende...
Beispielsweise
int marks[] = {20, 22, 23};
Was ist der Grund dahinter?
char[]
s nicht zu Ende in'\0'
entweder...- Relative
- Alle Antworten unten keine Antwort auf die gestellte Frage.
- Ja, ich weiß, Kumpel, dass Sie nicht richtig beantwortet, aber ich habe den Punkt, von jemandem die Antwort, warum '\0' wird nicht am Ende des numerischen arrays 🙂
- Fragen Sie sich diese Frage: Können Sie sich einen Grund denken, würden Sie wollen, ein array von ganzen zahlen, von denen mindestens einer von Ihnen ist
0
? Zum Beispielint a[] = {0,1,2,3,4};
Den Wert0
alsint
hat Nützlichkeit. Es gibt keine-so-Nützlichkeit in einem "string" in der C-Sinne, über Ihren Zweck als terminator, und als solche waren wir gesegnet mit der null-terminierte string-Konzept. Ich kann mir keinen anderen Weg, um zu quantifizieren, ist es darüber hinaus, dass (ehrlich gesagt). Und viele, darunter auch ich, wollen das pascal-Stil (Länge, Präfix) Zeichenkette hätte angenommen, statt. - Ich Schätze, dass 🙂
- Warum alle Jungs posting, dass "array von chars ist kein string" als Antworten? Es ist absolut wahr, und es wurde geschrieben von Dennis Meng im ersten Kommentar. Aber, dass keineswegs die Frage beantwortet, die Frage!
- Da es im Zusammenhang mit der Frage. In meiner Antwort, die ich klären, warum
\n
ist nicht für arrays. - Ich habe dieses array endete 0:
int arr[] = {3, 4, 0};
ja, was? - Warum 4 upvotes für eine schlecht formulierte Frage? Was ist der Punkt?
- Durch Konvention, in C eine Zeichen "string" endet mit einer "null" - Zeichen. Dies ist, weil die Länge der Zeichenfolge ist nicht "außen beschrieben". Alle array-nichts ist nutzlos, wenn Sie nicht wissen, es ist die Länge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage enthält eine versteckte Annahme, dass alle
char
arrays tun Ende mit einem null-Zeichen. Dies ist in der Tat nicht immer der Fall: diechar
arrays, das muss ein Ende haben mit dem null-Zeichen sind diejenigen gemeint, für die Verwendung als Zeichenfolgen, die in der Tat erfordern Kündigung.In deinem Beispiel, die
char
array nur endet mit einem null-Zeichen, denn Sie machte es so. Der einzige Ort, wo der compiler legen Sie das null-Zeichen für Sie wird bei der Deklaration eines char-array ein string-literal, wie:In diesem Fall das null-Zeichen automatisch eingefügt werden, um das resultierende array eine gültige C-Zeichenkette. Keine solche Pflicht besteht für arrays von anderen numerischen Typen, noch kann Sie initialisiert werden, die aus einem string-literal. In anderen Worten, das anfügen einer null auf einem numerischen array dienen würde keinen Zweck, weil es keinen code gibt, verwendet die null zu suchen das array zu Ende, da zero ist ein absolut gültige Zahl.
Arrays von Zeigern sind manchmal beendet mit einem NULL-Zeiger ist, was Sinn macht, da ein NULL-Zeiger nicht verwechselt werden kann mit einem gültigen Zeiger. Die
argv
array von strings ist, erhielt vonmain()
, ist ein Beispiel für ein array.\0
im Zeichen-array dient nur dazu, um das array eine gültige C-Zeichenkette. Wenn dort ist keine Voraussetzung, um es ein string ist (wie es offensichtlich der Fall für nicht-char
arrays), eine nachgestellte 0 ist nutzlos.Why the numeric arrays does not end with a null character?
Einen string endet mit einem 0-terminator, sondern ein string ist nicht das gleiche wie ein array. Wir verwenden arrays, um store Saiten, aber wir verwenden Sie arrays zum speichern von Dinge, die sind nicht strings. Das ist, warum arrays im Allgemeinen nicht automatisch eine 0 Hinzugefügt.
Außerdem in jedem generischen array von
int
, 0 kann ein Gültiger (nicht-sentinel -) Wert.Kann ein array-Ende in alles, was ein Gültiger Wert des array-Elements geben. Aber nur ein
\0
beendetchar
array aufgerufen wird, ein string.Beispielsweise
Gültig, aber nicht ein string, der Beschränkung, dass Sie nicht verwenden können, es in Funktionen erwartet einen string, wie
strlen
etc.Zur Klärung von OP ' s Kommentar unten, durch den C-standard, alle Zeichen-Literale wie
'a'
,'1'
usw., einschließlich'\0'
Typint
. Und Sie können ein'\0'
am Ende einerint
array wie dieses:Aber die Menschen normalerweise nicht tun, weil es ist üblich, dass
'\0'
wird nur verwendet, um terminierte " strings. Der obige code ist äquivalent zuint
einschließlich\0
.'\0'
mich. Ich wuchs schnell Weg von dieser Gewohnheit beim portieren von code beschmutzt mit einer solchen hand-setzen Sie Abschlusswiderstände von ANSI zu Unicode. Hunderte von Dateien pauschal ersetzen'\0'
mitL'\0'
machte mir klar, half-way-through " - duh. nur ersetzen Sie es mit0
und lassen Sie den compiler Sortieren es aus mit der richtigen Förderung".'\0'
ist das gleiche wie0
. Und es ist nicht einzigartig. Der Charakter'A'
ist die gleiche wie die integer -65
in jedem ASCII-Maschine. Wie ich schon sagte, es ist nur, dass konventionelle'0'
hat diese Besondere Bedeutung der Beendigung Saiten.0
ist eine gemeinsame Wache in bestimmter Probleme.Können Sie
int
array-Ende mit0
auch, wenn Sie das wünschen:Seit
'\0'
und0
sind genau die gleichen, könnte man auch ersetzen die0
oben'\0'
.Ihre Verwirrung könnte durch das automatische einfügen von
'\0'
in einer Erklärung wie:In der vorstehenden definition von
s
entsprichtchar s[] = {'h', 'e', 'l', 'l', 'o', '\0'};
. Denke, dass dies eine praktische-Verknüpfung von C-standard. Wenn Sie möchten, können Sie erzwingen, dass ein nicht-null-terminierte char-array, indem Sie explizit über die Größe:Im obigen Beispiel
s
nichtNUL
beendet.Beachten Sie auch, dass die Zeichen-Literale in C sind vom Typ
int
, so'\0'
ist eigentlich einint
. (Auch weitere,char
ist ein integraler Typ.)-Wall -Wextra
plus ein paar andere), es nicht zu warnen, über diese.int
array mit 0, da 0, in den Kontext von Programm, kann ein Gültiger Wert. Ich denke, genau das war die Frage.0
ist eine gültigechar
. In einem speziellen Fall, dass ein C-string,0
verwendet wird, als string-terminator (sentinel-Wert). Dieser Fall ist nicht anders als mit0
als Abschlusszeichen für eineint
array, wenn das array enthalten soll, die nur positive Werte. All die Leute, die diese Frage beantwortet haben, wissen bereits alle der oben genannten.Musst du am Ende C-strings mit
'\0'
da dies ist, wie die Bibliothek weiß, wo der string endet.Die
NUL
-die Kündigung ist, was unterscheidet ein char-array aus einem string (aNUL
-terminiertes char-array). Die meisten string-Manipulation-Funktionen stützt sich aufNUL
zu wissen, Wann der string zu Ende ist (und seinen job getan ist), und funktioniert nicht mit einfachen char-array (zB. Sie werden weiter arbeiten Vergangenheit die Grenzen des Arrays, und weiter, bis es findet eineNUL
irgendwo im Gedächtnis - oft verdirbt Speicher, wie es geht).NULL
ist nicht angemessen. Es istNUL
null oder besser, nur0
.NULL
ist eine null-Zeiger-Konstante.Why the **numeric** arrays does not end with a null character?
Sie nicht haben, um eine
'\0'
char am Ende des Zeichen-array! Dies ist eine falsche Annahme. Es gibt keine Regel, die sagt, Sie tun. Zeichen (char
- Typ) sind, genau wie jede andere Art von Daten.Haben Sie, um eine null-terminierte char-Arrays wenn Sie möchten drucken Sie das array mit standard -
printf
- Familie Funktionen. Aber nur, weil diese Funktionen sind abhängig von der Endung der Zeichen-array -'\0'
char.Funktionen haben oft Regeln über die Art der Daten, die Sie erwarten. String (
char[]
) Funktionen sind nicht die Ausnahme. Aber dies ist nicht eine Sprache, die Anforderung, es ist die API, die Sie verwenden, welche diese Anforderungen.Char-array endet mit special char
'\0'
so dass es behandelt werden kann, als string.Und wenn Sie so manipulieren, string-es muss einen Weg geben die Länge(Grenze), dass string.
Blick auf Funktion Prototyp strcpy
Woher weiß er, zu kopieren, wie viele Zeichen von der Quelle zum Ziel? Die Antwort ist, indem man die position der
'\0
'.Den
'\0'
char ist prominent beim Umgang mit string alschar *
. Ohne'\0'
als end-marker, würden Sie nicht in der Lage gewesen, zu behandelnchar *
als string.Gibt es drei, vielleicht vier anständige Möglichkeiten ein array der Länge, nur zwei davon werden Häufig in C:
Verfolgen Sie die Länge selbst, und übergeben Sie es zusammen mit dem Zeiger.
Dies ist, wie arrays in der Regel arbeiten. Es erfordert keine spezielle Formatierung, und macht die sub-array-Blick trivial zu vertreten. (Ergänzen Sie den Zeiger, subtrahieren Sie von der Länge, und es ya go.)
Jede Funktion in der standard-Bibliothek, die Werke mit nicht-string-arrays erwartet, dass diese bereits. Und sogar einige Funktionen, die Sauerei mit strings (wie
strncat
oderfgets
) tun es um der Sicherheit Willen.Kündigen das array mit den "sentinel" - Wert.
Dies ist, wie C-strings arbeiten. Weil fast jeder Zeichensatz/Codierung in der Existenz definiert
'\0'
als non-printable", "nichts tun" control-Zeichen, es ist also nicht ein typischer text, so verwenden Sie es zu beenden, eine string Sinn macht.Beachten Sie, dass, wenn Sie einen
char[]
als byte-array, obwohl, haben Sie immer noch geben Sie eine Länge. Das ist, weil bytes sind keine Zeichen. Sobald Sie den Umgang mit bytes anstelle von Zeichen0
verliert seine Bedeutung als sentinel-Wert und geht zurück auf plain old data.Das große Problem ist, dass bei den meisten grundlegenden Arten, jede mögliche Anordnung der
sizeof(type)
bytes darstellen könnten, eine gültige, sinnvolle Wert. Für ganzzahlige Werte, null ist besonders üblich, ist es wahrscheinlich eines der am meisten verwendeten und nützlichsten zahlen in allen computing. Ich erwarte vollständig, um in der Lage sein, eine0
in ein array von Ganzzahlen, ohne dabei zu verlieren, die Hälfte meiner Daten.Also stellt sich die Frage, was wäre ein guter sentinel-Wert? Was sonst-rechtlichen-Nummer sollte verboten werden, in arrays? Und diese Frage hat keine gute, allgemeingültige Antwort; es kommt ganz auf Ihre Daten. Wenn Sie So wollen, so etwas zu tun, Sie sind auf Ihre eigenen.
Neben dem fehlen eines anständigen sentinel-Wert, dieser Ansatz fällt flach mit nicht-Charakter-Typen aus einem anderen Grund: es ist mehr kompliziert zu repräsentieren Teilmengen der Reihe. Damit eine rekursive Funktion zu übergeben, Teil des Arrays selbst, es hätte legen Sie die sentinel-Wert, die sich selbst aufrufen, und dann wieder den alten Wert. Entweder das, oder es könnte übergeben Sie einen Zeiger auf den Anfang des Bereichs und die Länge des Bereichs. Aber warte mal...ist das nicht was du versuchst zu vermeiden? 😛
Vollständigkeit halber, die beiden anderen Methoden:
Erstellen Sie ein struct, speichern der array-Länge, zusammen mit einem Zeiger auf die Daten.
Dies ist eine weitere Objekt-orientierten Ansatz und ist, wie arrays funktionieren in fast jeder modernen Sprache (und, wie Vektoren arbeiten in C++). Es funktioniert OK, in C wennn du eine API zum verwalten von solchen Strukturen, und iff verwenden Sie die API-religiös. (Objekt-orientierten Sprachen bieten eine Möglichkeit zum befestigen der API, um das Objekt selbst. C nicht, so ist es bis zu Ihnen, zu bleiben, um die API.) Aber jede Funktion, die nicht speziell für die Arbeit mit Ihren Strukturen sein müssen, übergeben Sie einen Zeiger (und womöglich Länge) mit einer der beiden oben genannten Methoden.
Pass zwei Zeiger.
Dies ist ein gemeinsamer Weg, um pass eine "range" in C++. Übergeben Sie einen Zeiger auf den Beginn des array und einen Zeiger gerade über das Ende. Es ist weniger Häufig bei C, obwohl, weil Sie mit raw-Pointern
(start,length)
und(start,end)
stellen die gleichen Daten -- und C keine Iteratoren und Vorlagen, machen es so viel mehr nützlich.Arrays selbst nicht zu
0\
beendet, ist die Nutzung von Zeichen-arrays, die in einer bestimmten Weise, das muss Sie sein\0
beendet. Die standard-Bibliothek Funktionen, die sich auf Zeichen-arrays verwenden die\0
zu erkennen, die Ende des Arrays und somit behandeln Sie es als eine Zeichenfolge, die dieses Verhalten bedeutet, dass die Nutzer dieser Funktionen werden Folgen müssen, die\0
Kündigung Voraussetzung. Wenn Ihre Zeichen-array Nutzung keine solche Funktion, dann braucht er nicht die\0
terminator.Ein array von char nicht notwendiger endet mit \0.
Es ist eine C-Konvention, die Zeichenketten werden beendet mit \0.
Dies ist nützlich, um finden Sie am Ende der Zeichenfolge.
Aber wenn Sie interessiert sind, nur halten die Daten, die vom Typ char haben, können Sie sich ein \0 am Ende oder nicht.
Wenn Ihr array von char verwendet werden soll, als string, Sie sollten hinzufügen \0 am Ende.
BEARBEITEN: Was wird beendet durch \0 string-literalen, nicht mit dem array von char.
Die Frage ist schlecht formuliert.
Ein Beispiel zu nehmen, die zeigen, dass, wie \ \ 0 verwechseln, wenn man Sie in einem integer-array:-
So, jetzt das array wird davon ausgegangen, dass 0(markiert) ist ein Ende des Arrays, das ist nicht wahr.
\0
ist in der Regel verwendet, um zu beenden eine Zeichenkette. In der string -\0
gilt als das Ende der Zeichenfolge.In Ihrem Beispiel müssen Sie nicht kündigen, es mit '\0'
Fand eine sehr interessante wiki post:-
Überprüfen Sie auch ein related post:- nul beenden eines int-array
Haben wir eine Konvention: besonderen Charakter
'0'
mit numerischer code0
markiert das Ende des Strings.Aber wenn Sie wollen, zu markieren, Ende
int
array, wie Sie wissen, ist, dass0
ist eine gültige array-Mitglied-oder end-of-array-mark? Also, im Allgemeinen, es ist nicht möglich, eine solche Marke.In anderen Worten:
Den Charakter
'\0'
(aber nicht Charakter'0'
code48
) keinen Sinn im Kontext der text-string (von der Konvention, es ist ein besonderes Zeichen, markiert das Ende), so dass es kann verwendet werden als end-of-array-Marke:Integer
0
oder\0
(was dasselbe ist), sind gültige Ganzzahl. Es kann Sinn, und das ist, warum es nicht verwendet werden als end-of-array-Marke:int votesInThisThread[] = { 0, -1, 5, 0, 2, 0 }; //Zeroes here is a valid numbers of upvotes
Wenn du ' L versuchen zu erkennen, Ende dieser Beispiel-array durch die Suche
0
erhalten Sie die Größe 0.Das ist, was Frage?
0
ist eine "gültige"char
als gut. Nichts in der C-Sprache hält mich davon ab, zu tunchar s[] = "hello\x00world";
(Können Sie erraten, wassizeof s
wäre in diesem Fall?0
(ACSII-code48
) und\0
(code0
) sind nicht das gleiche.'0'
ist das Zeichen-literal für die der ASCII-Wert 48. Da ist die Frage redenchar
arrays, und nicht unbedingt Streicher'\0'
kann ein gültiges Zeichen in einem array.char
arrays. Es wird über warumint
arrays nicht end-of-array markieren. Lies den ersten post aufmerksam, finden, Frage, Markierungen, so werden Sie wissen, was ich Rede.'0'
ist nicht das gleiche wie0
. Ebenso'\0'
ist nicht das gleiche wie\0
.\0
bedeutet noch nicht einmal etwas, es sei denn, es ist in Anführungszeichen gesetzt werden.0
haben keinen Sinn in einer Zeile des Textes (es hat eine Besondere Bedeutung), aber es kann eine gültige integer-Zahl im Kontext von int-Arrays (wie alle anderen integer).string
Methoden nicht sehen, Teile der Literale, die Folgen der ersten null-byte, aber auch andere Methoden, die kennen den Zweck der Daten, auf die string-literal-Punkte verwenden können, die ganze Sache. Wenn, als Beispiel, muss code schreiben byte-Sequenz 1,2,3,0,3,2,1 es könnte etwas tun, wiewrite_data("\x01\x02\x03\x00\x03\x02\x01", 7);
. Es wäre die Verantwortung der code mit dem string-literal zu wissen, wie lange es ist, da das null-byte nicht sagen.