Zeichenfolgenabschluss – char c=0 vs char c=’\0′

Lesezeit: 4 Minuten

Benutzeravatar von Joe DF
Joe DF

Beim Abschluss eines Strings erscheint mir das logisch char c=0 ist äquivalent zu char c="\0"da das “null” (ASCII 0) Byte ist 0aber normalerweise neigen die Leute dazu '\0' stattdessen. Ist das nur aus Vorliebe oder sollte es eine bessere “Praxis” sein?

Was ist die bevorzugte Wahl?


BEARBEITEN: K&R sagt: “Die Zeichenkonstante '\0' stellt das Zeichen mit dem Wert Null dar, das Nullzeichen. '\0' wird oft statt geschrieben 0 um die Charakternatur eines Ausdrucks zu betonen, aber der numerische Wert ist nur 0.

  • Hallo Joe DF! Lese jetzt K&R und hatte dieselbe Frage. Gegoogelt “\0 in C-String” und der zweite Link führt zu Ihrer Frage. Es hat mir geholfen 😉

    – wassil111

    24. Juli 2016 um 19:03 Uhr

  • @vasili111 Ich bin froh, dass es dir geholfen hat. 🙂

    – Joe DF

    21. September 2016 um 5:15 Uhr

Benutzeravatar von Nobilis
Nobilis

http://en.wikipedia.org/wiki/Ascii#ASCII_control_code_chart

Binary   Oct  Dec    Hex    Abbr    Unicode  Control char  C Escape code   Name
0000000  000  0      00     NUL     ␀       ^@            \0              Null character

Es gibt keinen Unterschied, aber der idiomatischere ist '\0'.

Ablegen als char c = 0; könnte bedeuten, dass Sie beabsichtigen, es als Zahl (z. B. einen Zähler) zu verwenden. '\0' ist eindeutig.

  • Garantiert der C-Standard ASCII?

    – Ciro Santilli OurBigBook.com

    27. Juni 2015 um 21:21 Uhr

  • @CiroSantilli六四事件法轮功纳米比亚胡海峰 Nein, ich schaue mir den C99-Standard an und es gibt ein paar Fußnoten, die ASCII in Bezug auf die Implementierung von Trigraphen und Sprachimplementierungen in ASCII erwähnen, und das war’s. Es ist etwas, das durch die Implementierung definiert ist (beachten Sie Zeichensätze wie EBCDIC von IBM). Aber ich denke, Sie würden Schwierigkeiten haben, eine moderne C-Implementierung zu finden, die nicht auf den ASCII-Zeichensatz angewiesen ist. Hier gibt es einige nützliche Informationen dazu.

    – Nobilis

    28. Juni 2015 um 12:49 Uhr

  • Ja, das war auch ungefähr das, was meine Lektüre des C99 ergab. Danke für die Frage, hatte ich noch nicht gefunden.

    – Ciro Santilli OurBigBook.com

    28. Juni 2015 um 13:28 Uhr

  • Insbesondere in C/C++ werden 0 oder ‘\0’ auch verwendet, um das String-Literal zu beenden, z. B.: “abc\0″+”def” wird “abc”. Dies ist ein Ort, an dem ‘\0’ visueller ist

    – Andiana

    6. Dezember 2016 um 8:45 Uhr

Benutzeravatar von Michal Bukovy
Michal Bukowy

'\0' ist nur ein ASCII-Zeichen. Das Gleiche wie 'A'oder '0' oder '\n'

Wenn du schreibst char c="\0“, es ist dasselbe wiechar c = 0;

Wenn du schreibst char c="A"es ist dasselbe wie char c = 65

Es ist nur eine Zeichendarstellung und es ist eine gute Übung, es zu schreiben, wenn Sie wirklich das NULL-Byte der Zeichenfolge meinen. Seit char ist in C ein Byte (ganzzahliger Typ), es hat keine besondere Bedeutung.

  • oder 0b1000001 oder 0101, das ist in meiner Antwort nicht wichtig. Es ist alles Nummer.

    – Michal Bukowy

    6. Juni 2013 um 13:16 Uhr

  • Der Zeichensatz muss nicht ASCII-kompatibel sein, also muss ‘A’ nicht gleich 65 sein. (ZB ist EBCDIC nicht ASCII-kompatibel.) Ich kenne keinen Zeichensatz, der einen Wert ungleich Null verwendet für das NUL-Zeichen.

    – Paul Groke

    21. März 2017 um 11:01 Uhr


  • @PaulGroke Danke für den Kommentar! Ich frage mich, ob es einen Zeichensatz gibt, der einen Wert ungleich Null für das Nullzeichen verwendet. Zu beachten: 1) wie Nobilis erwähnt hat: Der C-Standard garantiert kein ASCII; 2) wie Keith Thompson erwähnt hat (nützlich zu wissen): Die Vorzeichenbelegung von Plain Char ist implementierungsdefiniert (Quelle: stackoverflow.com/a/62682671/9881330).

    – pmor

    6. Januar 2021 um 23:02 Uhr


Die bevorzugte Wahl ist die, die den Lesern Ihres Codes die Möglichkeit gibt, zu verstehen, wie Sie Ihre Variable verwenden – als Zahl oder als Zeichen. Am besten verwenden Sie 0, wenn Sie Ihre Variable als Zahl meinen, und ‘\0’, wenn Sie meinen, Ihre Variable ist ein Zeichen.

Die obigen Antworten sind schon recht eindeutig. Ich teile nur mit einer Demo, was ich über dieses Problem gelernt habe.

#include <stdlib.h>
#include <stdio.h>


char*
mystrcat(char *dest, char *src) {
    size_t i,j;
    for(i = 0; dest[i] != '\0'; i++)
        ;
    for(j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

int main() {
    char *str = malloc(20); // malloc allocate memory, but doesn't initialize the memory
    // str[0] = '\0'; 
    str[0] = 0;
    for (int k = 0; k <10; k++) {
        char s[2];
        sprintf(s, "%d", k);
        mystrcat(str, s);
    }
    printf("debug:%s\n", str);
    return 0;
}

In dem obigen Programm habe ich verwendet malloc um den Zeiger zu initialisieren, aber malloc initialisiert den Speicher nicht. Also nach dem mystrcat Betrieb (der fast derselbe ist wie der strcat Funktion in glibc), kann die Zeichenfolge Messcode enthalten (da der Speicherinhalt nicht initialisiert wird).

Also muss ich den Speicher initialisieren. In diesem Fall str[0] = 0 und str[0] = 0 beide können es zum Laufen bringen.

1411080cookie-checkZeichenfolgenabschluss – char c=0 vs char c=’\0′

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy