2011-01-04 12 views
13

Wie kann ich auf s[7] in s zugreifen?Unterschied zwischen strncpy und memcpy?

Ich habe keinen Unterschied zwischen strncpy und memcpy festgestellt. Wenn ich will, die Ausgabe s drucken, zusammen mit s[7] (wie qwertyA), was sind die Änderungen, die ich muss in den folgenden Code aus:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char s[10] = "qwerty", str[10], str1[10]; 
    s[7] = 'A'; 
    printf("%s\n",s); 
    strncpy(str,s,8); 
    printf("%s\n",str); 
    memcpy(str1,s,8); 
    printf("%s\n",str1); 
    return 0; 
} 
/* 
O/P 
qwerty 
qwerty 
qwerty 
*/ 
+1

Swapping Versuchen 'memcpy' und' strncpy' in Ihr vorstehender Code. Dann erlebe den Unterschied. –

+0

Ein anderer Unterschied ist die Typüberprüfung und der zurückgegebene Typ. Wichtig in anderen Fällen, nicht hier. – chux

Antwort

6

Sie erhalten die Ausgabe querty, da der Index 7 falsch ist (Arrays werden von 0 indiziert, nicht 1). Es gibt eine null-terminator bei Index 6, um das Ende der Zeichenfolge zu signalisieren, und was auch immer danach kommt, wird keine Wirkung haben.

Zwei Dinge müssen Sie beheben: die 7 in s[7]-6

  • hinzufügen Nullabschluss bei s[7]
  • Das Ergebnis wird

    1. Wechsel:

      char s[10] = "qwerty"; 
      s[6] = 'A'; 
      s[7] = 0; 
      

      Original not working und fixed working.

      Wie für die Frage von strncpy gegenüber memcpy, ist der Unterschied, dass strncpy fügt einen Null-Terminator für Sie. ABER, nur wenn der Quellstring einen vor n hat. Also strncpy ist was Sie hier verwenden möchten, aber seien Sie sehr vorsichtig mit dem großen ABER.

    2

    zu machen "qwertyA" Sie brauchen s[6] = 'A' und s[7]='\0'

    Strings von 0 indiziert werden eingestellt, so s[0] == 'q', und sie müssen null beendet werden.

    +0

    Ich sollte nicht s [7] zu s [6] ändern. Wenn wir s [6] als 'A' setzen, erhalten wir die gewünschte Ausgabe. – user559208

    +3

    @Benutzer sagen Sie also * wollen * nicht die gewünschte Ausgabe? O_o –

    +0

    @ user559208: als marcog "change' s [6] 'in' s [7] schrieb "" Ich denke, er meinte eigentlich, anstatt s [7] zu schreiben, schreibe s [6]. Vergessen Sie auch nicht die Nullbeendigung der Zeichenkette (Einstellung 's [7]' auf '0' oder' '\ 0''), da dies hilft, zu verhindern, dass sich Überlauffehler einschmuggeln. –

    20

    Andere haben auf Ihre Null-Terminierungsprobleme hingewiesen. Sie müssen Null-Terminierung verstehen, bevor Sie den Unterschied zwischen memcpy und strncpy verstehen.

    Der Unterschied ist, dass memcpy wird kopiert alle N Zeichen, die Sie fragen, während strncpy wird bis zum ersten Null-Abschlusszeichen einschließlich, oder N-Zeichen, je nachdem, was weniger ist. (Wenn weniger als N Zeichen kopiert werden, wird der Rest mit Nullzeichen aufgefüllt.)

    +6

    Es gibt noch einen weiteren Unterschied, strncpy füllt den Rest des Platzes mit 0. Wenn Sie 'strncpy (a, b, 255);' und a ist 10 lang, strncpy kopiert diese 10 Zeichen und füllt die verbleibenden 240 Zeichen mit 0. – nos

    +0

    @nos: Ich habe das vorher bemerkt und es bearbeitet . Danke trotzdem :) –

    2

    Wenn Sie:

    char s[10] = "qwerty"; 
    

    das ist, was das Array enthält:

     
    s[0] 'q' 
    s[1] 'w' 
    s[2] 'e' 
    s[3] 'r' 
    s[4] 't' 
    s[5] 'y' 
    s[6] 0 
    s[7] 0 
    s[8] 0 
    s[9] 0 
    

    Falls Sie ein 'A' bis zum Ende der Zeichenfolge hinzugefügt werden soll, ist, dass bei Index 6 da Array-Indizes beginnen bei 0

    s[6] = 'A'; 
    

    Beachten Sie, dass, wenn Sie ein Array auf diese Weise initialisieren, der verbleibende Speicherplatz auf 0 (a nul t gesetzt Erminator), in diesem Fall nicht benötigt, in der Regel beachten Sie, dass Sie Ihre Strings null terminiert müssen. z.B.

    char s[10]; 
    strcpy(s,"qwerty"); 
    s[6] = 'A'; 
    s[7] = 0; 
    

    Im obigen Beispiel "qwertz", wird einschließlich seiner nul Terminator s kopiert. s [6] überschreibt diesen Nullterminator. Da der Rest von s nicht initialisiert ist, müssen wir uns ein nul Terminator mit s[7] = 0;

    2

    Strncpy hinzufügen kopiert bis zu NULL auch Sie die angegebene Anzahl Bytes zu kopieren, aber Memcpy wird bis zu angegebene Anzahl von Bytes kopieren.

    printf Anweisung bis zu NULL drucken, so dass Sie versuchen, eine einzelne charater zu drucken, es zeigen,

    printf("\t%c %c %c\t",s[7],str[7],str1[7]); 
    

    OUTPUT

    7    7