2011-01-04 5 views
13

Comment puis-je accéder à s[7] dans s? Je n'ai observé aucune différence entre strncpy et memcpy. Si je veux imprimer la sortie s, avec s[7] (comme qwertyA), quels sont les changements que je dois fait dans le code suivant:Différence entre strncpy et memcpy?

#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

Essayez d'échanger '' memcpy' et dans strncpy' votre code ci-dessus. Alors éprouvez la différence. –

+0

Une autre différence est la vérification de type et le type retourné. Important dans d'autres cas, pas ici. – chux

Répondre

6

vous obtenez la sortie querty car l'index 7 est incorrect (les tableaux sont indexés à partir de 0, pas 1). Il y a un null-terminator à l'index 6 pour signaler la fin de la chaîne, et tout ce qui vient après cela n'aura aucun effet.

Deux choses que vous devez corriger:

  1. Modifier le 7 dans s[7]-6
  2. Ajouter un null-terminaison à s[7]

Le résultat sera:

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

Original not working et fixed working. En ce qui concerne la question de strncpy par rapport à memcpy, la différence est que strncpy ajoute un terminateur nul pour vous. MAIS, seulement si la chaîne source en a une avant n. Donc strncpy est ce que vous voulez utiliser ici, mais faites très attention à la grosse MAIS.

2

Pour faire « qwertyA » vous devez définir s[6] = 'A' et s[7]='\0'

Les chaînes sont indexées de 0, donc s[0] == 'q', et ils doivent être nulle fin.

+0

Je ne devrais pas changer s [7] à s [6]. Si nous définissons s [6] comme "A" alors nous obtiendrons la sortie désirée .. – user559208

+3

@user donc vous dites que vous * ne voulez pas * la sortie désirée? O_o –

+0

@ user559208: quand marcog a écrit "change' s [6] 'à' s [7] '" je pense qu'il voulait dire au lieu d'écrire s [7], écrire s [6]. N'oubliez pas non plus la fin nulle de la chaîne (en réglant 's [7]' sur '0' ou' '\ 0'') car cela évitera que des bogues dépassés ne s'y inscrivent. –

20

D'autres ont signalé vos problèmes de terminaison nulle. Vous devez comprendre la terminaison nulle avant de comprendre la différence entre memcpy et strncpy. La différence est que memcpy copiera tous les N caractères que vous demandez, tandis que strncpy copiera jusqu'au premier terminateur nul inclus, ou N caractères, selon le nombre le moins élevé. (S'il copie moins de N caractères, il remplira le reste avec des caractères nuls.)

+6

Il y a également une autre différence, strncpy remplira le reste de l'espace avec 0. p. Ex. si vous faites 'strncpy (a, b, 255);' et a est long de 10, strncpy va copier ces 10 caractères et remplir les 240 caractères restants avec 0. – nos

+0

@nos: Je me suis rendu compte que vous l'aviez fait avant, et l'ai édité . Mais merci quand même :) –

2

Lorsque vous avez:

char s[10] = "qwerty"; 

c'est ce que ce tableau contient:

 
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 

Si vous souhaitez ajouter un 'A' à la fin de votre chaîne, qui est à l'index 6 , puisque les indices de tableau commencent à 0

s[6] = 'A'; 

Notez que lorsque vous initialisez un tableau de cette façon, l'espace restant est réglé sur 0 (NUL t erminator), Bien que cela ne soit pas nécessaire dans ce cas, sachez généralement que vous devez mettre fin à vos cordes. par exemple.

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

Dans l'exemple ci-dessus "qwerty", y compris son terminateur NUL est copié à s. s [6] écrase ce terminateur nul. Étant donné que le reste de s n'est pas initialisé, nous devons ajouter une terminaison nous NUL avec s[7] = 0;

2

strncpy copiera jusqu'à NULL même que vous avez spécifié le nombre d'octets à copier, mais memcpy copierons jusqu'à nombre spécifié d'octets.

printf imprimera à NULL, alors vous essayez d'imprimer un seul charater, il montrera,

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

SORTIE

7    7