2012-04-21 12 views

Antwort

3

In C, wenn Sie einen Zeiger auf ein Array haben, gibt es keine Möglichkeit, die Länge dieses Arrays zu bestimmen. Wie @AProgrammer darauf hinwies, hätten die Entwickler es dabei belassen und den Programmierer gezwungen, die Länge aller Zeichenfelder im Auge zu behalten. Dies hätte jedoch die Textverarbeitung in C noch schwieriger gemacht.

Daher entschieden sich die Sprachentwickler für eine Konvention, die es ermöglichen würde, die Zeichenfolgenlänge durch das Vorhandensein eines Nullzeichens abzuleiten, das das Ende der Zeichenfolge angibt.

Betrachten wir zum Beispiel strcpy:

char *strcpy(char *destination, const char *source); 

Es gibt keine Möglichkeit, in C ist die Länge des Arrays zu bestimmen, dass die Zeiger destination und source Punkt. Ohne das Vorhandensein eines Sentinel-Werts, um das Ende der Zeichenfolge anzuzeigen, wäre die einzige andere Lösung gewesen, zusätzliche Parameter zu übergeben, die die Länge der Zeichenfolge source angeben.

Natürlich wurden im Hinblick auf moderne Sicherheitsaspekte String-Verarbeitungsfunktionen eingeführt, die Pufferlängenparameter erhalten. Aber die Computerlandschaft sah zu der Zeit, als die nullterminierte Zeichenkette erfunden wurde, sehr anders aus.

+0

ja aber, ich meine wenn ich char arr [2] = {'h', 'i'}; Ich schätze der Compiler kennt die Länge von arr. –

+0

@AlexDannk Ja, das stimmt. Aber es ist offensichtlich nicht sinnvoll, wenn alle Strings auf die gleiche Länge beschränkt sind. –

+0

Entschuldigung! Ich habe nicht verstanden, was du damit meinst.Sie sagten, es ist nützlich, um die Länge des Arrays zu kennen. aber der Compiler kennt bereits die Länge jedes Arrays. also finde ich es nicht nützlich –

0

Im Allgemeinen gibt es keinen Grund, dies zu tun, aber Sie müssen wissen, dass jede Zeichenkette per Definition ein char Array mit Null-Terminator ist. Wenn Ihr char Array eine Zeichenfolge darstellt, gibt jede Funktion, die mit C-Zeichenfolgen arbeitet, den richtigen Wert nicht zurück oder verhält sich anders als erwartet, wenn Sie den Nullabschlusszeichen weglassen.

Jedoch ist char ein Typ wie int, float oder double, so dass Sie frei char Array erstellen, wie Sie möchten, ohne dass sie nullterminierte zu sein.

8

Ein Char-Array muss nicht null terminiert sein (Standard-Bibliotheksfunktionen, die davon nicht abhängig sind, sind memcpy, memmove, strncpy - schlecht benannt dieser neueste, printf mit der richtigen Formatzeichenfolge).

Eine NUL-terminierte Zeichenkette (NTC) muss definitionsgemäß durch eine NUL abgeschlossen werden. Es ist das von den String-Handling-Utilities der C-Standardbibliothek erwartete Format und die von den meisten C-Programmen verwendete Konvention (in C++ verwendet man normalerweise std :: string)

+0

so ist es wie ein convenion !. Aber warum haben sie es so gemacht? könnte nicht viel einfacher sein, es nicht null-terminiert zu machen. Ich verstehe es nicht. Ich lese, dass zum Beispiel, wenn ich ein null-beendetes Array pintout, der Compiler weiß, wann man Druck stoppt. So ist dieses Nullzeichen irgendwie nützlich, um zu verhindern, dass der Rest von Junk-Zeichen gedruckt wird. Vielen Dank! –

+0

@Alex In Ihrem vorgeschlagenen Design müssten alle Strings die gleiche Länge haben. –

+0

@Alex, die Alternative zu einem Endmarker (wie NUL), ist ein Längenfeld. In der Praxis vereinfacht das Arbeiten mit einem Sentinel oft Algorithmen und erlaubt es Ihnen, keine willkürliche maximale Größe für Strings zu haben, ohne einen Overhead für alle von ihnen zu bezahlen (ja, zu der Zeit würde die Wahl zwischen einem 1 Byte- oder zwei Bytes großen Feld) war hart, die Erinnerung war eng, aber beschränkte sich auf 255 Zeichen? Ich denke, dass es das Spätere gewesen wäre, das gewählt worden wäre). – AProgrammer

0

Nur wenn Sie es als String verwenden möchten. Dann suchen alle C/C++ - String-Funktionen am Ende nach dem Null-Zeichen, und wenn es nicht da ist, suchen sie weiter und früher oder später stürzt Ihre Anwendung ab.

Wenn Sie nur Array-Zeichen als Array von Zeichen verwenden möchten, die sich niemals auf sie als Zeichenfolgen beziehen, dann ist das kein Problem. Es ist genau wie eine Reihe von Ints.

+0

was ist das. char arr [2] = {'h', 'i'}; cout << arr; Also warum stürzt es nicht ab, da der Compiler das Nullzeichen nicht finden wird, um zu beenden. –

+0

@Alex - Es scheint manchmal zu funktionieren, aber das Ergebnis ist wirklich undefiniert. Wir kennen den Wert des nächsten Bytes nach dem Array nicht - es könnte nur Null sein. In diesem Fall sieht der angezeigte Wert gut aus. Wenn nicht, zeigt das Programm möglicherweise Müll an oder stürzt ab. –

+0

@BoPersson: vielen Dank –

Verwandte Themen