Bonjour,
Comment est-ce que je peux enregistrer la valeur contenue dans le pointeur *ptr dans la variable tableau mot2 ici ?
Merci pour votre aide.Code:
1
2
3
4
5
6 void main(){ char mot1[15]={"test"}; char mot2[15]; char *ptr; ptr = mot1; }
Version imprimable
Bonjour,
Comment est-ce que je peux enregistrer la valeur contenue dans le pointeur *ptr dans la variable tableau mot2 ici ?
Merci pour votre aide.Code:
1
2
3
4
5
6 void main(){ char mot1[15]={"test"}; char mot2[15]; char *ptr; ptr = mot1; }
Bonjour,
Il faut utiliser une fonction de copie comme strcpy ou strncpy(celle la est mieux, pas de risque de dépasser la taille du tampon de destination).
Code:
1
2
3
4
5
6
7
8
9
10 #include <string.h> void main(){ char mot1[15]={"test\0"}; char mot2[15]={0}; char *ptr; ptr = mot1; strncpy(&mot2, ptr, strlen(ptr)); }
Bonsoir,
- Le retour de la fonction main() est de type int et non void.
- char mot1[15]={"test\0"}; aucun besoin d'accolades ou de \0 explicite à la fin :
Rajouter un \0 comme tu le fais reviendrait à avoir {'t', 'e', 's', 't', '\0', '\0'}.Code:
1
2
3 char mot1[15] = "test"; // équivalent à char mot1[15] = {'t', 'e', 's', 't', '\0'};
- strncpy(&mot2, ptr, strlen(ptr)); : mot2 dans & devant. Et son utilisation ici avec strlen() est strictement équivalente à utiliser strcpy() et ne constitue en rien une sécurité évitant de dépasser la taille du tampon de destination. Imaginons que ptr pointe sur une chaine de longueur supérieure à 15 caractères (ce n'est évidemment pas le cas ici), alors strlen(ptr) renverrai cette même longueur > 15.
C'est la taille du tampon de destination qu'il faut mettre, cette de char mot2[15], soit 15 ici, et ne pas oublier de rajouter le '\0' en dernière position dans le cas où la chaine source dépasse cette capacité et que ce dernier n'est alors pas ajouté par la fonction.
Avec visual studio je n'ai pas le choix, je dois mettre void et non int dans la fonction main et je ne retourne rien.
Et pourtant, c'est la norme (au sens du traité ratifié)
Soit tu utilises un très vieux Visual, soit tu compiles dans un mode étrange, soit tu fais une erreur.
Quel message exactement as-tu quand tu définis main comme
Code:int main() {...}
Le vocabulaire utilisé n’est pas tout à fait correcte :
- *ptr n’est pas un pointeur, en revanche ptr oui
- La seule valeur que contient un pointeur, c’est une adresse
- On peut parler de la valeur pointé, et en l’occurrence c’est 't'
- la variable tableau mot2 n’est pas modifiable
- On peut toutefois modifier le contenu du tableau
La bonne formulation serait plutôt : « Comment copier la chaine pointé par ptr dans le tableau mot2 ? ». Et la réponse est naturellement strcpy().
Bonjour
"ptr" contient exactement la même chose que "mot1" donc tu peux t'en servir exactement de la même façon => strcpy(mot2, mot1) ou bien strcpy(mot2, ptr)Rarement vu un code aussi horrible chez un intervenant. Sur ces 6 lignes il y a 3 erreurs !!!
- main est de type int
- on ne mixe pas l'écriture "tableau" et l'écriture "chaine" => soit on écrit {...}, soit on écrit "..." (ou alors c'est qu'on veut stocker un tableau de chaines)
- pas de "&" devant un nom de tableau car c'est déjà une adresse
Sinon tu veux bien m'expliquer comment strlen(chaine_d'origine) empêchera de dépasser la taille du tampon de destination ???
Je débute en C et comme j'ai lut vite fait, ça donne une très mauvaise réponse. il est vrai qu'il aurait fallut un truc du genre:
désolé!!!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include<stdlib.h> #include<string.h> int main () { char mot1[15]="test"; char *mot2; int i; if ( (mot2 = calloc( (strlen(mot1) + 1), sizeof (char) ) ) == NULL) exit(1); for (i = 0; i < (strlen(mot1) + 1); i++) mot2[i] = 0; strncpy(mot2, mot1, strlen(mot1)); }
Identique à strcpy(mot2, mot1) puisque strlen() comme strcpy() s'arrêtent tous deux au premier '\0' trouvé dans "mot1". Identique mais moins rapide puisqu'il y a un appel inutile à une fonction de plus...
Pareil. Inutile d'appeler calloc() puisque strcpy() rajoutera le '\0' qu'il faut. Donc pourquoi tout mettre à 0 puisque le seul 0 réellement nécessaire sera bien écrit au bon moment ? Un simple malloc() suffit.
Ceci dit, si tu utilises strncpy() alors calloc() se justifie puisque strncpy() ne met pas forcément le 0 final.
Accessoirement, tu as reproduit le code de strdup()...
je ne connaissais pas strdup() et, effectivement, ça fait beaucoup de code pour pas grand chose. Je me coucherais moins bête ce soir.
Attention, strdup() ne fait pas partie du standard C, c'est une fonction POSIX.
J'ai vu, c'est pour ça que je la connaissais pas. Je travaille avec le standard ISO/EIC 9899:201x comme référence. Faut que je trouve le standard POSIX en pdf.