4 Stimmen

Grundlegende C-Zeigerfrage

Ich lese gerade ein "Lerne C"-Buch und bin auf eine Frage gestoßen, die ich wirklich nicht verstehe. Der Zweck der Übung ist es, das Problem dieses Codes zu finden:

char c;

c = 'a';

printf("c hält das Zeichen %c.",c);

..und dann wird die Erklärung gegeben, dass: "Der Textstring "a" aus zwei Zeichen besteht, sowohl 'a' als auch das terminierende Nullbyte. Die Variable c hat nur eine Größe von einem einzigen Byte. Selbst wenn c 2 Bytes lang wäre, könntest du einen Textstring auf diese Weise nicht kopieren. Versuche den Text ein Byte nach dem anderen in eine ausreichend große Variable zu kopieren, um den Textstring und sein terminierendes Nullbyte zu speichern."

Als ich jedoch den obigen Code ausführte, funktionierte er einwandfrei. Ich dachte, ich hätte die Theorie verstanden, warum es schlecht ist - das ganze terminierende 0 am Ende einer Zeichenfolge, also schrieb ich den Code um, um es zu testen:

char c[2];

*c = 'a';

printf("c hält das Zeichen %c.",c);

Aber das führt zu einem Problem. Ich fange an, verwirrt zu werden, was das Problem betrifft. Würde dieser zweite Code nicht den Buchstaben 'a' dem Zeiger bei c[0] übergeben und dann das terminierende 0 bei c[1] setzen - und somit die 2 Plätze im Array vollständig nutzen?

3 Stimmen

Ich nehme nicht an, dass es doppelte Anführungszeichen um das a in Zeile 2 herum gab? (c = "a";) Das würde fehlschlagen, um ... da ein einzelnes Anführungszeichen ein Zeichen ist und alles in doppelten Anführungszeichen ein String ist (also nullterminiert).

0 Stimmen

Dein erstes Beispiel ist zu 100 % korrekt, es gibt keine Probleme damit. Bist du sicher, dass du es korrekt kopiert hast?

0 Stimmen

Vielen Dank, Jungs, ihr hattet recht - das Beispiel im Buch hatte doppelte Anführungszeichen. Sie haben jedoch nicht erwähnt, was eine der Antworten feststellt, dass doppelte Anführungszeichen nullterminiert sind und einfache Anführungszeichen nur ein Zeichen sind. Vielen Dank.

0voto

Sundar Punkte 414

In C, 'c' is a single character whereas, "c" is a character string. (Beachten Sie die doppelten Anführungszeichen). Die Erklärung des Buchautors über die Variable, die 2 Bytes belegt, passt nur zum zweiten Fall.

In Ihrem ersten Code-Segment weisen Sie einer perfekt gültigen 1-Byte-Char-Variable einen Char zu und drucken sie aus. Das funktioniert also.

In Ihrem zweiten Code-Segment weisen Sie einem Char ein Char-Array (oder wenn Sie es eine Zeichenfolge nennen möchten) zu und 'null-terminieren' es nicht. Wenn Sie die printf-Funktion darauf aufrufen, weiß printf nicht, wo die Zeichenfolge endet. Das Verhalten von printf ist somit hier nicht definiert.

0voto

Niels Basjes Punkte 10158

Etwas stimmt nicht mit der Erklärung im Buch überein. Das 'a' ist ein einzelnes Zeichen (beachte die einfachen Anführungszeichen) und "a" ist ein String. Jetzt ist "a" tatsächlich mit 0x00 endend. Aber 'a' nicht.

Mein vorläufiger Schluss ist, dass entweder etwas durcheinander geraten ist, als Sie die Informationen aus dem Buch kopiert haben ... oder ... der Titel "Lerne C" das Ziel des Autors des Buches war.

0voto

Anshul garg Punkte 225

In C beschreiben einfache Anführungszeichen ein einzelnes Zeichen, z.B. 'a', während doppelte Anführungszeichen "a" einen nullterminierten String erstellen

Also das

int main(void)
{
    char s[2]="a";

    // s='a'; führt zu einem Fehler mit inkompatiblen Typen.........
    printf("%s",s);

    return 0;
}

wird gut funktionieren

0voto

Bei der Programmierung in C haben ein Zeichen in einfachen Anführungszeichen: 'a', und ein Zeichen in doppelten Anführungszeichen: "a", unterschiedliche Auswirkungen.

Indem man ein Zeichen in einfachen Anführungszeichen setzt, zeigt man an, dass 'a' als ein einzelnes Zeichen interpretiert werden soll, so dass kein abschließendes Nullbyte hinzugefügt wird.

Wenn Sie Ihr Zeichen in doppelten Anführungszeichen setzen, wird es als String deklariert. In diesem Fall wird automatisch ein abschließendes Nullbyte am Ende angefügt und Sie müssen sich keine Sorgen machen. Der resultierende String lautet:

"a/0"

Wenn Sie Ihre Variable str auf den String "a" initialisieren möchten und nur einfache Anführungszeichen verwenden möchten, müssen Sie das abschließende Nullbyte explizit hinzufügen.

char str[2];
str[0] = 'a';
str[1] = '/0';
printf("str hält den String %s.", str);

Andernfalls könnten Sie einfach den ersten Index von str auf "a" initialisieren, indem Sie doppelte Anführungszeichen verwenden, und das abschließende Nullbyte wird automatisch am zweiten Index hinzugefügt.

char str[2];
str[0] = "a";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X