2011-01-04 54 views
13

Come posso accedere a s[7] in s?Differenza tra strncpy e memcpy?

Non ho riscontrato alcuna differenza tra strncpy e memcpy. Se voglio stampare l'output s, insieme a s[7] (come qwertyA), quali sono i cambiamenti che ho a fatto nel codice seguente:

#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

provare a scambiare '' memcpy' e strncpy' in il tuo codice sopra. Quindi prova la differenza. –

+0

Un'altra differenza è il controllo del tipo e il tipo restituito. Importante in altri casi, non qui. – chux

risposta

6

hai trovato l'uscita querty perché l'indice 7 è corretto (gli array sono indicizzati da 0, non 1). C'è un null-terminator all'indice 6 per segnalare la fine della stringa, e qualsiasi cosa succeda dopo non avrà alcun effetto.

due cose che dovete risolvere:

  1. Modificare il 7 in s[7]-6
  2. Aggiungere un null-terminatore s[7]

Il risultato sarà:

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

Original not working e fixed working.

Per quanto riguarda la domanda di strncpy versus memcpy, la differenza è che strncpy aggiunge un terminatore null per l'utente. MA, solo se la stringa di origine ne ha una prima di n. Quindi, strncpy è quello che vuoi usare qui, ma stai molto attento al grande MA.

2

di fare "qwertyA" è necessario impostare s[6] = 'A' e s[7]='\0'

stringhe sono indicizzati da 0, quindi s[0] == 'q', e hanno bisogno di essere terminata.

+0

Non dovrei cambiare s [7] con s [6]. Se impostiamo s [6] come 'A', otterremo l'output desiderato. – user559208

+3

@user, quindi stai dicendo che * non * vuoi l'output desiderato? O_o –

+0

@ user559208: quando marcog ha scritto "change' s [6] 'a' s [7] '" Penso che in realtà intendesse dire invece di scrivere s [7], scrivere s [6]. Inoltre, non dimenticare la terminazione nulla della stringa (impostando 's [7]' a '0' o' '\ 0'') perché ciò aiuterà a prevenire gli errori di overrun da strisciando dentro. –

20

Altri hanno segnalato problemi di terminazione nulla. È necessario comprendere la terminazione nullo prima di comprendere la differenza tra memcpy e strncpy.

La differenza è che memcpy copierà tutti i N caratteri richiesti, mentre strncpy copierà fino al primo terminatore null incluso, o N caratteri, a seconda di quale dei due è inferiore. (Se copia meno di N caratteri, riempirà il resto con caratteri nulli.)

+6

C'è un'altra differenza, strncpy riempirà il resto dello spazio con 0. ad es. se fai 'strncpy (a, b, 255);' e a è lungo 10, strncpy copierà quei 10 caratteri e riempirà i rimanenti 240 caratteri con 0. – nos

+0

@nos: me ne sono reso conto prima, e lo ho editato in . Ma grazie comunque :) –

2

Quando si dispone di:

char s[10] = "qwerty"; 

questo è ciò che array contiene:

 
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 

Se si desidera aggiungere una 'A' alla fine della stringa, che è in corrispondenza dell'indice 6 , poiché gli indici di matrice partono da 0

s[6] = 'A'; 

noti che quando si inizializza un array in questo modo, lo spazio rimanente viene impostato a 0 (un nul t erminator), Anche se non è necessario in questo caso, in genere sii consapevole del fatto che è necessario rendere le stringhe nul terminate. ad es.

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

Nell'esempio precedente "qwerty", compreso il suo terminatore nul viene copiato s. s [6] sovrascrive quello nul terminator. Dal momento che il resto della s non è inizializzata abbiamo bisogno di aggiungere un terminatore nul noi stessi con s[7] = 0;

2

strncpy copierà fino a NULL anche specificato il numero di byte da copiare, ma memcpy copieremo fino al numero specificato di byte.

printf stamperà fino a NULL, quindi si cercherà di stampare un singolo charater, mostrerà,

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

USCITA

7    7