Frage Warum müssen wir am Ende eines Zeichenarrays in C ein '\ 0' (null) hinzufügen?


Warum müssen wir am Ende eines Zeichenarrays in C ein '\ 0' (null) hinzufügen? Ich habe es in K & R 2 (1.9 Character Array) gelesen. Der Code in dem Buch, um die längste Zeichenfolge zu finden, ist wie folgt:

#include <stdio.h>
#define MAXLINE 1000
int readline(char line[], int maxline);
void copy(char to[], char from[]);

main() {
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];
    max = 0;
    while ((len = readline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

int readline(char s[],int lim) {
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0'; //WHY DO WE DO THIS???
    return i;
}

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

Meine Frage ist, warum wir das letzte Element des Zeichenarrays als '\ 0' setzen? Das Programm funktioniert gut ohne es ... Bitte hilf mir...


11
2017-12-16 18:15


Ursprung


Antworten:


Sie müssen C-Strings mit beenden '\0' Denn so weiß die Bibliothek, wo die Zeichenfolge endet (und in Ihrem Fall ist dies die copy() Funktion erwartet).

Das Programm funktioniert gut ohne es ...

Ohne es hat Ihr Programm undefiniertes Verhalten. Wenn das Programm das tut, was Sie erwarten, haben Sie nur Glück (oder eher Pech, denn in der realen Welt wird das undefinierte Verhalten sich in den unbequemsten Umständen manifestieren).


14
2017-12-16 18:17



In c bedeutet "String" ein nullterminiertes Array von Zeichen. Vergleichen Sie dies mit einer Pascal-Zeichenfolge, die höchstens 255 Zeichen entspricht, der ein Byte vorausgeht, das die Länge der Zeichenfolge angibt (aber keine Beendigung erfordert).

Jede Appraich hat ihre Vor- und Nachteile.


1
2017-12-16 18:24



Vor allem String Pointer, die auf ein Array von Zeichen ohne Länge verweisen, sind die einzige Möglichkeit NULL Terminator bestimmt die Länge der Zeichenfolge.

Tolle Diskussion über NULL-Terminierung bei Verknüpfung


1
2017-12-16 18:20



Weil C eine Zeichenkette als definiert zusammenhängende Folge von Zeichen, die durch und einschließlich des ersten Nullzeichens abgeschlossen sind.

Grundsätzlich hatten die Autoren von C die Wahl, eine Zeichenkette als eine Folge von Zeichen + die Länge einer Zeichenkette zu definieren oder eine magische Markierung zu verwenden, um das Ende der Zeichenkette zu begrenzen.

Für weitere Informationen zu diesem Thema empfehle ich diesen Artikel zu lesen:

"Der teuerste Ein-Byte-Fehler" von Poul-Henning Kamp http://queue.acm.org/detail.cfm?id=2010365


0
2017-12-16 18:34



Sie haben die Antwort selbst hier geschrieben:

void copy(char to[], char from[]) {
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

Die Schleife in dieser Funktion wird fortgesetzt, bis sie im Array auf ein '\ 0' trifft von. Ohne einen abschließenden Nullpunkt wird die Schleife eine unbekannte Anzahl von Schritten durchlaufen, bis sie auf eine Null oder einen ungültigen Speicherbereich trifft.


0
2017-12-16 18:50



Wirklich, du tust es nicht muss ein Zeichenarray mit \ 0 beenden. Es ist das char *, oder die C-Darstellung der Zeichenfolge, die damit beendet werden muss.

Wie für das Array müssen Sie ein \ 0 hinzufügen nach sein Ende, wenn Sie es in die Zeichenkette übertragen möchten (Repräsentation durch char *).

Auf der anderen Seite müssen Sie \ 0 am Ende des Arrays haben, wenn Sie es als char * adressieren und planen möchten, char * -Funktionen darauf zu verwenden.


0
2017-12-17 11:26



'\0' im Array zeigt das Ende der Zeichenkette an, was bedeutet, dass ein beliebiges Zeichen nach diesem Zeichen nicht als Teil der Zeichenkette betrachtet wird. Es bedeutet nicht, dass sie nicht Teil des Zeichens sind. d. h., wir können immer noch auf diese Zeichen durch Indizieren zugreifen, aber sie sind nur nicht Teil, wenn wir Zeichenfolgen-bezogene Dinge auf dieses Zeichenfeld aufrufen.

Damit eine Zeichenfolge im richtigen Format vorliegt und ordnungsgemäß mit den Zeichenfolgenfunktionen funktionieren kann, muss es sich um ein Zeichenfeld mit Nullabschluss handeln. Ohne NULL zeigen die Programme undefiniertes Verhalten, wenn wir die Zeichenfolgenfunktionen im Zeichen-Array aufrufen. Auch wenn wir mit den Ergebnissen meistens Glück haben, ist es immer noch ein undefiniertes Verhalten.


0
2017-12-12 07:28