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.

9voto

jdehaan Punkte 19398

Die Erklärung, dass: "Die Zeichenfolge "a" aus zwei Zeichen besteht, beide 'a' und das terminierende Nullbyte.

Dies ist wahr, aber das 'a' ist nicht "a". 'a' ist ein einzelnes Zeichen. Also passt 'a' sehr gut in einen char.

Das Beispiel zum Schreiben eines Zeichens in eine Zeichenfolge sollte so aussehen:

char str[2];
str[0] = 'a';
str[1] = 0; /* weil nichts garantiert, dass Array-Elemente auf 0 initialisiert sind */
printf("str enthält die Zeichenfolge %s.", str);

8voto

Bill Karwin Punkte 493880

Der Text ist falsch, oder du transkribierst den Code falsch.

In C ist ein in doppelte Anführungszeichen gesetzter String nullterminiert. Ein in einfache Anführungszeichen gesetztes Zeichen ist nur ein Zeichen.

2voto

Aaron Anodide Punkte 16524

In C geben einfache Anführungszeichen einen Zeichenwert an.

2voto

Oliver Charlesworth Punkte 259497

In Ihrem zweiten Beispielcode-Schnipsel wird c als Zeiger auf das erste Element im Array interpretiert (dh als char *), nicht als char. Sie könnten entweder Folgendes tun:

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

oder

printf("c enthält das Zeichen %c.", c[0]);

oder

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

Im letzten Beispiel sagt %s printf(), dass es einen String anstelle eines Zeichens erwarten soll. In diesem Fall müssen Sie jedoch das zweite Element von c[] auf einen "Nullterminator" setzen (z.B. c[1] = '\0'), sonst wird printf() nicht wissen, wo der String endet, und potenziell wird er eine unendliche Menge an Müll ausdrucken.

1voto

arscariosus Punkte 1286

Strings in C sind eigentlich Zeichenarrays. Also char c[2]; ist eine Deklaration für c, das ein Array von Zeichen mit 2 Elementen ist. Es ist falsch, es mit 'a' zuzuweisen, da es ein Zeichenliteral ist, du solltest es mit "a" zuweisen, das ein Stringliteral ist. Denk daran, den Unterschied zwischen einfachen und doppelten Anführungszeichen zu beachten, wie bereits in den vorherigen Kommentaren erwähnt.

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