2 Stimmen

Grundlegende C-Frage zum Kopieren von Zeichenfeldern in Zeiger auf Zeichenfolgen

Ich habe einige Zweifel beim grundlegenden C-Programmieren.

Ich habe einen Zeichenarray und muss es in einen Zeiger auf ein Zeichen kopieren. Also habe ich folgendes gemacht:

char a[] = {0x3f, 0x4d};
char *p = a;     
printf("a = %s\n",a);
printf("p = %s\n",p);
unsigned char str[] = {0x3b, 0x4b};
unsigned char *pstr =str;
memcpy(pstr, str, sizeof str);
printf("str = %s\n",str);
printf("pstr = %s\n",pstr);

Meine printf-Anweisungen für pstr und str werden mit den Daten "a" angehängt. Wenn ich memcpy entferne, erhalte ich Müll. Kann mich ein C-Guru erleuchten?

0 Stimmen

Du kopierst kein Array in einen Zeiger. Du erhältst einen Zeiger auf das erste Element eines vorhandenen Arrays. Keine Kopie.

0 Stimmen

Ich sehe nicht, wo etwas "angehängt" wird.

3voto

NPE Punkte 462670

Zunächst müssen C-Strings (das %s in printf) mit einem Abschlusszeichen (NUL) versehen sein. Ihnen fehlen die Abschlusszeichen. Versuchen Sie char a[] = {0x3f, 0x4d, 0} (das gleiche gilt für str).

Zweitens zeigen pstr und str auf denselben Speicher, daher ist Ihr memcpy bedeutungslos. Dies ist ein geringerer Punkt im Vergleich zum ersten.

2voto

Tony The Lion Punkte 59566

Fügen Sie einen Nullterminator hinzu, denn das erwartet printf:

char a[] = {0x3f, 0x4d, '\0'};

1voto

odrm Punkte 5021

Die Standardmethode, wie C-Zeichenfolgen dargestellt werden, besteht darin, dass sie im Speicher eine Sequenz von Nicht-Null-Bytes darstellen, die die Zeichen repräsentieren, gefolgt von einem Null-Byte. Du solltest deklarieren:

char a[] = {0x3f, 0x4d, 0};

Wenn du einen Zeiger auf eine Zeichenfolge zuweist (wie in unsigned char *pstr = str;), zeigen beide Zeiger auf den gleichen Speicherbereich und somit auf die gleichen Zeichen. Es ist nicht nötig, die Zeichen zu kopieren.

Wenn du Zeichen kopieren musst, solltest du strlen() verwenden, der sizeof()-Operator gibt die Anzahl der Bytes zurück, die sein Argument im Speicher verwendet. sizeof(pointer) ist die Anzahl der Bytes, die der Zeiger verwendet, nicht die Länge der Zeichenfolge. Du findest die Länge einer Zeichenfolge (also die Anzahl der Bytes, die sie im Speicher belegt) mit der Funktion strlen(). Außerdem gibt es standardmäßige Funktionen zum Kopieren von C-Zeichenfolgen. Du solltest dich darauf verlassen, um das Richtige zu tun:

strcpy(pstr, str);

0voto

Erik Punkte 85308

printf's %s erwartet einen durch Null terminierten String, deine Strings sind es nicht. Der nicht initialisierte Speicher nach deinen Arrays kann jedoch zufälligerweise mit einem 0-Byte beginnen, in welchem Fall dein Code korrekt erscheinen kann - er ist es jedoch immer noch nicht.

0voto

Ben Stott Punkte 2208

(Sie deklarieren ein Array "str" und zeigen dann darauf mit pstr. Beachten Sie, dass Sie kein Null-Terminierungszeichen haben. Daher kopieren Sie nach der Verwendung von memcpy den Block auf sich selbst, ohne ein Null-Terminierungszeichen, da eine Zeichenfolge benötigt wird. Somit kann printf das Ende der Zeichenkette nicht finden und druckt weiter, bis es eine 0 (oder '\0' in Zeichenbegriffen) findet)

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