2011-08-21 4 views
1

J'utilise deux tampons qui sont de unsigned char et quand j'ai utilisé la fonction strcpy, il y a une erreur de compilation qui dit "conversion invalide de unsigned char * en char *". Quelqu'un peut-il me dire quelle est la différence entre un tampon non signé et un tampon signé à la sortie? C'est le programme que j'avais essayé.Doutes dans la fonction strcpy utilisée

 main() 
     { 
       unsigned char buff[20] = "Michael"; 
       unsigned char dst[20] = "Jackson"; 
       strcpy(buff,dst); 
       printf("The string is %s\n",buff); 

     } 

Maintenant, quand je Typecast les parametrs passé dans strcpy à (char *), ce programe fonctionne bien comme indiqué ci-dessous

 main() 
     { 
       unsigned char buff[20] = "Michael"; 
       unsigned char dst[20] = "Jackson"; 
       strcpy((char *)buff,(char *)dst); 
       printf("The string is %s\n",buff); 

     } 

2 Question: Est-ce que transtypage à char * dans la fonction de chaîne créer une problèmes?

Veuillez me faire savoir si vous avez besoin d'autres entrées.

+3

@Yahia convenu: Maddy, vous avez plusieurs questions en suspens qu'aucune réponse n'a été acceptée pour; ont-ils vraiment pas répondu à votre question ou n'êtes-vous pas familier avec la façon dont cela fonctionne? – shelleybutterfly

Répondre

6

Vous pouvez simplement changer:

unsigned char buff[20] = "Michael"; 
unsigned char dst[20] = "Jackson"; 

à

char buff[20] = "Michael"; 
char dst[20] = "Jackson"; 

Pour penser logiquement, une chaîne ne peut être signé ou non signé, il n'est pas une valeur numérique à traiter de cette façon, c'est juste un tableau char et vous devriez le déclarer et l'utiliser ainsi.

Pourquoi obtenez-vous l'erreur?
strcpy a le prototype:

char *strcpy(char *restrict s1, const char *restrict s2); 

Et ce que vous lui passant est, unsigned char*, lorsqu'une fonction est appelée vérification de type de paramètre a lieu et le compilateur trouve que vous n'êtes pas appeler la fonction avec une bonne Si vous appliquez un cast, les arguments de la fonction correspondent et donc la compilation passe.

Est-ce que transtypage char dans la fonction de chaîne créer des problèmes? *
Non, dans ce cas, il ne fonctionne pas.
Bien qu'il soit plus logique de changer votre utilisation de unsigned char pour les raisons mentionnées ci-dessus dans la réponse.

Suggestion:
Strcpy n'est pas sûr, vous êtes beaucoup mieux à l'aide strncpy, il vous permet de spécifier explicitement le nombre de caractères à copier, plutôt que de compter sur terminaison nulle de la chaîne source, aussi cette aide éviter le débordement de tampon puisque vous spécifiez explicitement une longueur.

+0

@ Als..Oui j'avais changé cela et il a bien fonctionné.Mais je voudrais savoir la raison pour laquelle les tableaux non signés char ne peuvent pas être utilisés? – Maddy

+0

Eh bien, je pense juste parce que c'est la façon dont il est défini. char et unsigned unsigned sont deux types différents, et un littéral de chaîne comme "Hello World" est un tableau de char, non char non signé. La fonction strcpy (et strlen, strncpy, etc.) attend char *, non unsigned *. – shelleybutterfly

+0

@Maddy: S'il vous plaît vérifier la réponse mise à jour. –

5

La façon dont vous l'utilisez devrait fonctionner correctement.

Mais vous ne devriez pas utiliser les tableaux unsigned char avec fonctions de gestion de chaîne. Dans les chaînes C sont des tableaux char, pas des tableaux char non signés. Comme le passage à strcpy supprime le qualificatif unsigned, le compilateur avertit.

En règle générale, ne faites pas les choses sans signe lorsque vous n'avez pas à le faire.

+0

@cnicutar ... Le compilateur renvoie une erreur au lieu d'un avertissement. L'erreur est "conversion non valide de cchar * non signé en char * signé. Il est préférable d'utiliser des tableaux de chars toujours signés à la place des tableaux de chars non signés? – Maddy

+0

@Maddy compilateur est ce.Compilateur AC ** ne devrait pas le faire **. – cnicutar

+0

@Maddy Omettre "non signé" ne signifie pas "signé";) – cnicutar

0

strcpy veut char *, simple et clair. Cast vos tampons à char * et tout ira bien. Ensuite, il ya tout le problème de sécurité avec l'utilisation strcpy en premier lieu ...