2017-12-08 1 views
-2
#include <stdio.h> 

char strA[80] = "A string to be used for demonstration purposes"; 
char strB[80]; 

char *my_strcpy(char *destination, char *source) 
{ 
    char *p = destination; 
    while (*source != '\0') 
    { 
     *p++ = *source++; 
    } 
    *p = '\0'; 
    return destination; 
} 
int main(void) 
{ 
    my_strcpy(strB, strA); 
    puts(strB); 
} 

so ist meine Frage hier, dass, wenn ich den Teil herausnehmen: // * p = '\ 0';
es druckt die exakt gleiche Antwort, also warum ist das notwendig? Nach meinem Verständnis ist \ 0 ein Nul-Teil des Speichers nach einer Zeichenkette, aber da das Array strA bereits den Nul-Teil enthält, da es in "" ist, ist es wirklich notwendig?C++ Zeiger zu Arrays

+0

Sie müssen den Nullabschluss am Ende setzen, sonst wird der Puffer überlaufen. Versuchen Sie, die Zeichenfolge zurück zu kopieren, ohne "* p = '\ 0'" zu setzen. –

+0

Stellen Sie sich vor, Sie schreiben 'puts'. Wie würdest du es ohne den Nullabschluss machen? (Und nicht über eine andere Konvention, die C nicht verwendet) – chris

+1

Obwohl strA '\ 0' enthält, kopieren Sie es nicht davon, da Ihre Schleife bei diesem Zeichen stoppt (while (* source! = '\ 0')). – sajas

Antwort

0

Ihre Schleife stoppt, wenn sie die \0 sieht und daher wird sie nicht zum Ziel kopiert und das Ziel wird nicht NUL beendet. Ist das ein Problem?

  • Nicht, wenn Ihr Zielpuffer für alle 0s initialisiert
  • Nicht, wenn Ihr Code ist bereit, mit fester Länge Zeichenfolgen zu behandeln (so die my_strcpy Signatur müsste sich ändern, die Länge zurückzukehren)
  • Allgemein JA - das 0 beendet C-String ist eine solche gemeinsame Sache, die nicht nach der Konvention für Ärger bittet,

Ob die restlichen Werte sind die gleichen wie sie 0 kündigen oder nicht sein als du angefangen hast. Die 0-Beendigung macht Ihr Zeichen-Array nur zu einer "Standard-C-Zeichenfolge".

Für Argumente willen: Angenommen, Sie jeden String Platz für 80 Zeichen hatte wusste, dass du nur

tun konnte
for(int i = 0; i < 80; i++) 
{ 
    dest[i] = src[i]; 
} 

Die Wirkung ist die gleiche und die Quelle unter der Annahme, 0 das Ziel zu wird beendet.

+0

Also, wenn ich nicht nul beende, wird der Rest der gespeicherten Werte in StrB 0 sein? @ John3136 –

+0

@RostamMahabadi, Ihre 'my_strcpy' Funktion hat keine Möglichkeit zu wissen, dass' strB' überhaupt verwendet wird. Es könnte ebenso einfach ein Array von vollständig nicht initialisierten Daten oder ein Array ohne zusätzlichen Raum oder das gleiche Array wie die Quelle sein.Wenn Sie es nicht selbst beenden, wird eine große Anzahl von gültigen Aufrufen unvorhersehbares Verhalten verursachen, wenn Sie die kopierte Zeichenfolge verwenden. Es gibt nicht einmal Informationen, um den Rest des Ziels für Sie oder irgendetwas auf Null zu setzen. – chris

0

Es scheint, dass Sie bereits die Bedeutung des Nullabschluss wissen, aber der Punkt ist, Sie char strB[80]; in externen Namespace definiert (mit statischer Lebensdauer), die strB Initialisierung des Arrays bewirkt, das alle Bytes setzt bis Null. Deshalb können Sie den Unterschied nicht beobachten (denn auch wenn Sie kein Nullzeichen anhängen, ist der Rest von strB bereits).

Das Verschieben der Definition von strB macht dies sichtbar. strA muss nicht bewegt werden, weil es keine Rolle spielt.

In Wirklichkeit dieser Code

while (*source != '\0') 
{ 
    *p++ = *source++; 
} 
// *p = '\0'; 

Wenn *source ein Nullzeichen erreicht, es *p nicht kopiert wird, so dass Sie einen Terminator für das manualky brauchen hinzufügen.