Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2364 connectés 

  FORUM HardWare.fr
  Programmation
  C

  copie d'une chaine de caractères

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

copie d'une chaine de caractères

n°1229611
in_your_ph​ion
Posté le 24-10-2005 à 13:56:30  profilanswer
 

bonjour,
 
je voudrai copier une chaine de caractères dans une autre avec  while (*p++ = *q++); (et pas d'une autre manière, je sais qu'y fo pas faire comme ca ..)
 
j'ai ecrit le programme et ça marche pas dans l'affichage a la fin, je comprend pas  :sweat:  
 

Code :
  1. int main () {
  2.   char *q  = "bonjour";
  3.  
  4.   char *p= malloc(sizeof(char)*8);
  5.  
  6.   while (*p++ = *q++);
  7.   printf("chaine copiée %s\t chaine initiale %s\n",p,q);
  8.  
  9.   return 0;
  10. }


 
alors que si je fais  
 

Code :
  1. printf("chaine copiée %s chaine initiale %s\n",&p[-8],&q[-8]);

 
 
ca marche. Kesako ?   :??:  
 
 
 :love: merci par avance  :love:

Message cité 1 fois
Message édité par in_your_phion le 24-10-2005 à 13:56:57
mood
Publicité
Posté le 24-10-2005 à 13:56:30  profilanswer
 

n°1229618
Elmoricq
Modérateur
Posté le 24-10-2005 à 14:04:39  profilanswer
 

Code :
  1. char *p= malloc(sizeof(char)*8);


 
Teste ensuite si "p == NULL", des fois que malloc() ait échoué.
Il manque la désallocation qui va avec ton malloc, ajoute un free() quand tu as fini de te servir de p.
   

Code :
  1. while (*p++ = *q++);


 
Ton pointeur "se déplace". Avant d'incrémenter, il faudrait songer à sauvegarder la position initiale, c'est pourquoi (p-8) fonctionne avec ton printf(), et pas "p" tout court.
 
Ceci devrait fonctionner :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. int main (void)
  5. {
  6.   char *q  = "bonjour";
  7.   char *p= malloc(sizeof(char) * (strlen(q) + 1));
  8.  
  9.    if ( p )
  10.    {
  11.       char *p_tmp = p, *q_tmp = q;
  12.       while (*p_tmp++ = *q_tmp++);
  13.       printf("chaine copiée %s\t chaine initiale %s\n",p,q);
  14.       free(p), p = NULL;
  15.    }
  16.    else
  17.    {
  18.       fprintf(stderr, "Erreur d'allocation : p" );
  19.       /* gerer l'erreur comme tu l'entends */
  20.    }
  21.    return 0;
  22. }


 
(sinon tu as strcpy() qui fait ce que tu veux faire :o )

n°1229666
in_your_ph​ion
Posté le 24-10-2005 à 14:45:29  profilanswer
 

merci pour la réponse :))) mais je comprend pas pourquoi le fait d'utiliser des variables temporaires ca fait que ca marche ? et pourquoi mon pointeur se déplace  :??:  je suis nul ... :cry:  
 
 
est ce que le while fait :
 
1 - il incrémente les adresses 1,
2 - assigne la valeur de q à p de la case courante
 
jusqu'a ce que il tombe sur 0 ..? j'ai bon ? alors pourquoi ca decale tout ..??

Message cité 2 fois
Message édité par in_your_phion le 24-10-2005 à 14:48:23
n°1229671
jument
Merci mumu !
Posté le 24-10-2005 à 14:50:11  profilanswer
 

le pseudo de pholie ! [:dawa]

n°1229676
in_your_ph​ion
Posté le 24-10-2005 à 14:52:26  profilanswer
 

jument a écrit :

le pseudo de pholie ! [:dawa]


 
ça résoud pas mon problème :lol:

n°1229702
Elmoricq
Modérateur
Posté le 24-10-2005 à 15:13:53  profilanswer
 

in_your_phion a écrit :

merci pour la réponse :))) mais je comprend pas pourquoi le fait d'utiliser des variables temporaires ca fait que ca marche ? et pourquoi mon pointeur se déplace  :??:  je suis nul ... :cry:  
 
 
est ce que le while fait :
 
1 - il incrémente les adresses 1,
2 - assigne la valeur de q à p de la case courante
 
jusqu'a ce que il tombe sur 0 ..? j'ai bon ? alors pourquoi ca decale tout ..??


 
Ah flûte, le site d'Emmanuel est down on dirait. :/
 
Bon, en gros, un pointeur c'est une variable qui contient une adresse en mémoire. Quand tu l'incrémentes, tu modifies cette variable, et donc tu perds l'information d'origine, à savoir le départ de ton bloc mémoire.
 
C'est pour ça qu'il faut utiliser d'autres variables et laisser celles d'origine intactes pour conserver l'information.

n°1229725
in_your_ph​ion
Posté le 24-10-2005 à 15:40:26  profilanswer
 

Elmoricq a écrit :

Ah flûte, le site d'Emmanuel est down on dirait. :/
 
Bon, en gros, un pointeur c'est une variable qui contient une adresse en mémoire. Quand tu l'incrémentes, tu modifies cette variable, et donc tu perds l'information d'origine, à savoir le départ de ton bloc mémoire.
 
C'est pour ça qu'il faut utiliser d'autres variables et laisser celles d'origine intactes pour conserver l'information.


 
ok c'est bon je l'ai fait sur papier j'ai compris :) merci encore

n°1229727
Sve@r
Posté le 24-10-2005 à 15:41:36  profilanswer
 

in_your_phion a écrit :

merci pour la réponse :))) mais je comprend pas pourquoi le fait d'utiliser des variables temporaires ca fait que ca marche ? et pourquoi mon pointeur se déplace  :??:  je suis nul ... :cry:

Faut bien que tu comprennes que le C ne connait pas la chaîne de caractères. Il ne connait que l'adresse de début (l'adresse du premier caractère)
Ensuite, si tu veux traiter (afficher) ta chaine, tu utilises une fonction comme "printf" à laquelle tu passes cette adresse. La fonction traite (affiche) le caractère qu'il y a à cette adresse puis passe à l'adresse suivante. Et elle continue d'adresse en adresse jusqu'à trouver une adresse contenant la valeur 0. Là, elle s'arrête de boucler et se finit.
 
Comme le dit Elmoricq, si tu perds cette adresse de début, ben tu perds ta chaîne...
 

in_your_phion a écrit :

alors que si je fais  

Code :
  1. printf("chaine copiée %s chaine initiale %s\n",&p[-8],&q[-8]);

 
 
ca marche. Kesako ?   :??:

Tu as perdu ton début de chaine. Mais tu sais le retrouver car tu sais qu'il se trouve 8 positions avant le ptr courant. Tu passes donc à "printf" l'adresse réelle de début de chaine que tu retrouves en calculant "adresse courante - 8"
Ca aurait marché aussi si tu avais écrit

Code :
  1. printf("chaine copiée %s chaine initiale %s\n",p - 8,q - 8);

 
Car, dans un tableau, t[n] <=> *(t + n) et &t[n] <=> t + n
 

jument a écrit :

le pseudo de pholie ! [:dawa]

Oui, il nous a expliqué que cela n'avait rien à voir à ce à quoi on pense. C'est juste une concaténation de "in your philosophie je sais plus quoi"   :pt1cable:

Message cité 1 fois
Message édité par Sve@r le 24-10-2005 à 16:10:30

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1229770
Elmoricq
Modérateur
Posté le 24-10-2005 à 16:07:45  profilanswer
 

Sve@r a écrit :

Oui, il nous a expliqué que cela n'avait rien à voir à ce à quoi on pense. C'est juste une concaténation de "in your philosophie je sais plus quoi"   :pt1cable:


 
[:mlc]

n°1229783
in_your_ph​ion
Posté le 24-10-2005 à 16:17:11  profilanswer
 

in_your_phion a écrit :

in your philosophy once-over [:aloy]


 
heu .. j'ai juste un autre petite question si ca vous dérange pas ..:
 
quand je fais :
 

Code :
  1. char *p = "bonjour";


 
est ce qu'en suite je peux faire  

Code :
  1. p = NULL;


 
ou faire pointer p sur autre chose ???
 
 
et aussi .. quand je fais le test  

Code :
  1. while (*p++ = *q++);


 
qu'est ce qui est retourné au while quand la condition n'est plus vérifiée ??? le zéro du fin de la chaine, NULL, ..??  
 
 
 :love: merci encore par avance  :love:

Message cité 2 fois
Message édité par in_your_phion le 24-10-2005 à 16:42:47
mood
Publicité
Posté le 24-10-2005 à 16:17:11  profilanswer
 

n°1229864
matafan
Posté le 24-10-2005 à 18:19:47  profilanswer
 

Arrete de jouer avec ++.

n°1229929
in_your_ph​ion
Posté le 24-10-2005 à 19:50:50  profilanswer
 

matafan a écrit :

Arrete de jouer avec ++.


ok ..mais j'aimerais bien savoir qd meme  :cry:

n°1230037
el muchach​o
Comfortably Numb
Posté le 24-10-2005 à 22:22:50  profilanswer
 

in_your_phion a écrit :

heu .. j'ai juste un autre petite question si ca vous dérange pas ..:
 
quand je fais :
 

Code :
  1. char *p = "bonjour";


 
est ce qu'en suite je peux faire  

Code :
  1. p = NULL;


 
ou faire pointer p sur autre chose ???
 
 
et aussi .. quand je fais le test  

Code :
  1. while (*p++ = *q++);


 
qu'est ce qui est retourné au while quand la condition n'est plus vérifiée ??? le zéro du fin de la chaine, NULL, ..??  
 
 
 :love: merci encore par avance  :love:


 
Q1. Non, tu n'as pas le droit. Sauf si tu veux définitivement perdre l'adresse de la chaîne "Bonjour", qui est statiquement attribuée (à la compilation, enfin plus exactement lors de la mise en mémoire de l'image binaire).
 
Q2. En fin de chaîne, *q contient 0, donc on obient while(0), donc la boucle s'arrête.
En bref, c'est amusant, mais c'est une ruse de sioux qu'il vaut mieux s'interdire d'utiliser quand on ne s'appelle pas Brian Kernighan, ou Dennis Ritchie ou Ken Thompson.
Par ailleurs, la fonction implémentée de cette manière, à savoir strcpy, a probablement été la source de plus de bugs que toutes les autres fonctions C créées depuis.

Message cité 2 fois
Message édité par el muchacho le 24-10-2005 à 22:34:22

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1231754
in_your_ph​ion
Posté le 26-10-2005 à 17:52:26  profilanswer
 

el muchacho a écrit :

Q1. Non, tu n'as pas le droit. Sauf si tu veux définitivement perdre l'adresse de la chaîne "Bonjour", qui est statiquement attribuée (à la compilation, enfin plus exactement lors de la mise en mémoire de l'image binaire).
 
Q2. En fin de chaîne, *q contient 0, donc on obient while(0), donc la boucle s'arrête.
En bref, c'est amusant, mais c'est une ruse de sioux qu'il vaut mieux s'interdire d'utiliser quand on ne s'appelle pas Brian Kernighan, ou Dennis Ritchie ou Ken Thompson.
Par ailleurs, la fonction implémentée de cette manière, à savoir strcpy, a probablement été la source de plus de bugs que toutes les autres fonctions C créées depuis.


 
merci  :) .. pour la question 1, est ce que "bonjour" occupe toujours une place mémoire alors ? cette place ne pourra plus etre libérée vu qu'on a perdu l'adresse de départ ?!  :pt1cable: D'ailleurs je comprend pas pourquoi avec les malloc on se charge de faire un test mémoire et pas pour les tableaux .. les deux occupent pourtant la meme place, alors si ca passe pas avec malloc ca risque pas de passer avec un tableau statique, nan ?

Message cité 2 fois
Message édité par in_your_phion le 26-10-2005 à 17:59:34
n°1231812
Elmoricq
Modérateur
Posté le 26-10-2005 à 18:59:15  profilanswer
 

in_your_phion a écrit :

D'ailleurs je comprend pas pourquoi avec les malloc on se charge de faire un test mémoire et pas pour les tableaux .. les deux occupent pourtant la meme place, alors si ca passe pas avec malloc ca risque pas de passer avec un tableau statique, nan ?


 
Tableaux et malloc() n'adressent pas au même endroit. Si l'allocation d'un tableau échoue, ça plante immédiatement, c'est sans appel.
Tandis que pour malloc(), seul son code retour permet de savoir si l'allocation a échoué ou pas, le programme continue normalement.

Message cité 1 fois
Message édité par Elmoricq le 26-10-2005 à 19:00:15
n°1231848
in_your_ph​ion
Posté le 26-10-2005 à 19:45:39  profilanswer
 

Elmoricq a écrit :

Tableaux et malloc() n'adressent pas au même endroit. Si l'allocation d'un tableau échoue, ça plante immédiatement, c'est sans appel.
Tandis que pour malloc(), seul son code retour permet de savoir si l'allocation a échoué ou pas, le programme continue normalement.


 
aaah .. merci pour cette réponse :))) donc "bonjour" est toujours sotckée en mémoire et perdue à jamais dans le gosier de la bebete ??? ..mais où donc écrit malloc ? et les tableaux statiques ?? désolé pour toutes ces questions ... :sweat:  
 
 
 :love:  :love:  :love: merci encore   :love:  :love:  :love:

Message cité 1 fois
Message édité par in_your_phion le 26-10-2005 à 19:51:29
n°1231871
0x90
Posté le 26-10-2005 à 20:21:43  profilanswer
 

Google heap/stack ;)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1234696
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2005 à 04:15:49  profilanswer
 

in_your_phion a écrit :


quand je fais :

Code :
  1. char *p = "bonjour";


est ce qu'en suite je peux faire  

Code :
  1. p = NULL;




Oui, bien sûr. Un pointeur est une variable. Tu as le droit de le modifier.
 

Citation :


ou faire pointer p sur autre chose ???


Oui, bien sûr. Un pointeur est une variable. Tu as le droit de le modifier.
 
http://mapage.noos.fr/emdel/notes.htm#pointeurs
 

Citation :


et aussi .. quand je fais le test  

Code :
  1. while (*p++ = *q++);


qu'est ce qui est retourné au while quand la condition n'est plus vérifiée ??? le zéro du fin de la chaine, NULL, ..??  


*p (c'est à dire *q). A un certain moment, ça fait 0 et la boucle s'arrête.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1234697
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2005 à 04:17:34  profilanswer
 

el muchacho a écrit :

Q1. Non, tu n'as pas le droit. Sauf si tu veux définitivement perdre l'adresse de la chaîne "Bonjour", qui est statiquement attribuée (à la compilation, enfin plus exactement lors de la mise en mémoire de l'image binaire).


Ben si, c'est permis. Que ce soit utile ou non est une autre histoire, mais ça mord pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1234698
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2005 à 04:31:04  profilanswer
 

in_your_phion a écrit :

pour la question 1, est ce que "bonjour" occupe toujours une place mémoire alors ?


Oui. Cet emplacement étant attribué statiquement au démarrage du programme, avant l'appel de main(). il est libéré automatiquement que lorsque le programme se termine. C'est ce qu'on appelle la 'static duration', ou 'durée de vie permanente'.

Citation :

cette place ne pourra plus etre libérée vu qu'on a perdu l'adresse de départ ?


Gni ? Libérée par qui ? Elle n'a pas été allouée par un malloc(). C'est donc pas au programmeur de gérer sa libération. Qu'un pointeur pointe dessus ou non n'influence pas la gestion de la mémoire. De toutes façon, il n'y a roen a gérer si la mémoire est statique. C'est le système qui se débrouille...

  char *p = "bonjour";


et strictement identique à  

  char *p;
 
   p  = "bonjour";


Citation :

D'ailleurs je comprend pas pourquoi avec les malloc on se charge de faire un test mémoire


Parce qu'un malloc() peut échouer, et qu'il est effectué pendant l'exécution. Par définition, le chargeur du programme ne peut pas prévoir quelle mémoire dynamique va être utilisée. Il ne peut donc pas réserver quoique ce soit.

Citation :

et pas pour les tableaux .. les deux occupent pourtant la meme place, alors si ca passe pas avec malloc ca risque pas de passer avec un tableau statique, nan ?

Un tableau statique a une taille connue à la compilation. Le loader peut donc savoir qu'il lui faudra tant de kbytes pour pouvoir charger le programme. Ensuite, il paut ou non. Il y a des programmes qui commencent par un 'out of memeory", parce qu'il n'y a pas assez de place libre pour le chargement.
 
Ce qui peut aussi arriver c'est que la somme des variables statiques dépasse la taille possible pour un segment de donnée. Dans ce cas, c'est le linker qui rale (très courant en 16-bit avec les pages de 64k).
 
Enfin, un tableau défini en mémoire automatique (pile en général) peut être trop grand pour celle-ci. Le comportement est alors indéfini, et tout peut arriver, y compris un semblant de fonctionnement correct... A éviter absolument.
 
Le plus sûr, c'est de tendre vers le 100% dynamique. Tous les programmes sérieux fonctionnent comme ça...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1234699
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2005 à 04:39:08  profilanswer
 

in_your_phion a écrit :

aaah .. merci pour cette réponse :))) donc "bonjour" est toujours sotckée en mémoire et perdue à jamais dans le gosier de la bebete ??? ..mais où donc écrit malloc ? et les tableaux statiques ?? désolé pour toutes ces questions ... :sweat:  


Bases du C : Un processus utilise de la mémoire pour ses données :
 
Celle-ci se divise en 3 zones :  
 
- Mémoire statique
- Mémoire automatique
- Mémoire dynamique
 
La zone statique comprend les chaines, les variable éfinies hors bloc, ou en block avec le mot clé 'static'. La taille est connue au chargement. L'initialisation est faite avant le main().
 
La zone automatique (souvent implémentée par une pile d'une taille relativement faible) permet de créer des variables dont la durée de vie est limitée à un bloc. L'allocation et la libérartion, sont, comme sont nom l'indique, automatiques. On l'utilise pour les variables locales ('jetables').
 
La zone dynamique utilise toute la mémoire libre du processus. Elle est réservée par malloc() et rendue par free().
 
Les détails (segments etc.) appartiennent aux implémentations.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1240479
in_your_ph​ion
Posté le 07-11-2005 à 15:06:07  profilanswer
 

Emmanuel Delahaye a écrit :


  char *p = "bonjour";


et strictement identique à  

  char *p;
 
   p  = "bonjour";




 
AAaaAaaaAaAaAhhHHhhh.... je me meurs :( . Je ne comprend pas .. ca veut dire que "p" qui est une case qui normalement contient un chiffre qui correspond à une adresse peut aussi contenir une chaine de caractères ?! .. :??: ..pourquoi ? je croyais que les pointeurs devaient seulement contenir des adresses mémoires? on peut mettre d'autres trucs dedans alors ? comme des double, int, char ..etc ?
 
 :wahoo:  merci par avance pour vos explications mirifiques :wahoo:

n°1240499
Elmoricq
Modérateur
Posté le 07-11-2005 à 15:17:24  profilanswer
 

p contient l'adresse vers un bloc mémoire qui contient plusieurs char.
 
"bonjour" est une suite de char terminés par le caractère '\0'.
 
Quand tu écris :

char *p = "bonjour";


 
Tu dis, en clair : p reçoit l'adresse à laquelle se trouve la chaîne "bonjour".

n°1240524
in_your_ph​ion
Posté le 07-11-2005 à 15:42:09  profilanswer
 

Elmoricq a écrit :

p contient l'adresse vers un bloc mémoire qui contient plusieurs char.
 
"bonjour" est une suite de char terminés par le caractère '\0'.
 
Quand tu écris :

char *p = "bonjour";


 
Tu dis, en clair : p reçoit l'adresse à laquelle se trouve la chaîne "bonjour".


 
ah ok merci ! pfiou .. j'ai failli faire un arrêt cardiaque  :sweat: faut que je me calme là ...
 
mais alors, pourquoi on peut pas faire int *p = 10; .. ca pourrait tout simplement vouloir dire que p contient l'adresse du nombre 10..gah.  :pt1cable:

Message cité 1 fois
Message édité par in_your_phion le 07-11-2005 à 15:42:32
n°1240530
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 15:46:50  profilanswer
 

in_your_phion a écrit :

mais alors, pourquoi on peut pas faire int *p = 10; .. ca pourrait tout simplement vouloir dire que p contient l'adresse du nombre 10


Et c'est quoi l'adresse d'une constante ?

n°1240534
in_your_ph​ion
Posté le 07-11-2005 à 15:52:41  profilanswer
 

Emmanuel Delahaye a écrit :

Et c'est quoi l'adresse d'une constante ?


 
heu .. ben c'est &constante ? ...ce que je comprend pas c'est que quand on dit  

Code :
  1. char *p = "bonjour";


 
bah c'est bien une chaine constante la, non ? alors pourquoi ca marche pour les char et pas pour les chaines d'entiers  :??: ?

Message cité 1 fois
Message édité par in_your_phion le 07-11-2005 à 15:56:51
n°1240539
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 16:02:40  profilanswer
 

in_your_phion a écrit :

heu .. ben c'est &constante ? ...


Non. Par définition, une constante n'a pas d'adresse.

Citation :


ce que je comprend pas c'est que quand on dit  

Code :
  1. char *p = "bonjour";


bah c'est bien une chaine constante la, non ? alors pourquoi ca marche pour les char et pas pour les chaines d'entiers  :??: ?

Non. C'est une chaine littérale. C'est en fait un tableau de char initilisé non modifiable, et elle a une adresse de type char* qui est celle de son premier caractère. Ce n'est pas une expression constante. Il est d'ailleurs recommandé d'écrire

char const *p = "bonjour";


 
10 n'est pas une 'chaine d'entier'. C'est une valeur constante. (En assembleur, on dit 'valeur immédiate')

Message cité 1 fois
Message édité par Emmanuel Delahaye le 07-11-2005 à 16:03:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1240545
Elmoricq
Modérateur
Posté le 07-11-2005 à 16:12:58  profilanswer
 

Tiens d'ailleurs, question stupide : pourquoi {int 1, int 2, ..., int n} n'est pas compatible avec int* ?

n°1240547
in_your_ph​ion
Posté le 07-11-2005 à 16:13:23  profilanswer
 

Emmanuel Delahaye a écrit :

Non. Par définition, une constante n'a pas d'adresse.

Citation :


 
ben alors ? quand on dit &constante ? .. on nous aurait menti ?!  :??:  
 
ce que je comprend pas c'est que quand on dit  

Code :
  1. char *p = "bonjour";


bah c'est bien une chaine constante la, non ? alors pourquoi ca marche pour les char et pas pour les chaines d'entiers  :??: ?

Non. C'est une chaine littérale. C'est en fait un tableau de char initilisé non modifiable, et elle a une adresse de type char* qui est celle de son premier caractère. Ce n'est pas une expression constante. Il est d'ailleurs recommandé d'écrire

char const *p = "bonjour";


 
10 n'est pas une 'chaine d'entier'. C'est une valeur constante. (En assembleur, on dit 'valeur immédiate')


 
 
d'accord, merci beaucoup pour cette explication. Donc est ce qu'on peut dire que  

Code :
  1. char *p = "bonjour";


 
est un abu de langage ? puisque c'est en fait char p[6] = "bonjour"; ??
 
heu ...et quand on dit  

Code :
  1. char const *p


est-ce pareil que  
 

Code :
  1. const char *p


 
 
 :love:  :love:  :love: Merci encore  :love:  :love:  :love:

n°1240553
Elmoricq
Modérateur
Posté le 07-11-2005 à 16:17:28  profilanswer
 

in_your_phion a écrit :

Donc est ce qu'on peut dire que  

Code :
  1. char *p = "bonjour";


 
est un abu de langage ? puisque c'est en fait char p[6] = "bonjour"; ??


 
Pourquoi 6 ?!  :??:  
 
"char p[6]" définit une variable p de type "tableau de 6 caractères" (d'ailleurs il t'en faut 8 pour stocker "bonjour" : 7 pour les lettres, et 1 caractère de fin de chaîne qui est implicitement ajouté).
 
"char *p" définit une variable de type "adresse vers n char"
 
Donc :
const char *p = "bonjour";
n'est pas un abus de langage.

n°1240568
in_your_ph​ion
Posté le 07-11-2005 à 16:29:10  profilanswer
 

Elmoricq a écrit :

Pourquoi 6 ?!  :??:  
 
"char p[6]" définit une variable p de type "tableau de 6 caractères" (d'ailleurs il t'en faut 8 pour stocker "bonjour" : 7 pour les lettres, et 1 caractère de fin de chaîne qui est implicitement ajouté).
 
"char *p" définit une variable de type "adresse vers n char"
 
Donc :
const char *p = "bonjour";
n'est pas un abus de langage.


 
 
d'oh. En effet je me suis trompé, c'est 8 , enfin 7 ? char p[7] :whistle:  
 
haa .. alors je crois que je commence vaguement a comprendre. Mais alors du coup, pourquoi une constante n'a pas d'adresse ? ca veut dire que char p[6] n'a pas d'adresse ???? et le symbole "&" ca sert quand meme pour les constantes, non ?  :sweat:

Message cité 1 fois
Message édité par in_your_phion le 07-11-2005 à 16:30:51
n°1240572
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 16:31:40  profilanswer
 

in_your_phion a écrit :

d'accord, merci beaucoup pour cette explication. Donc est ce qu'on peut dire que  

Code :
  1. char *p = "bonjour";


 
est un abu de langage ? puisque c'est en fait char p[6] = "bonjour"; ??


Non, c'est autre chose. Tu confonds pointeur et tableau.
 
On peut faire ça :  
 
/* tableau de char initialise */
   char s[] = "bonjour";
 
/* pointeur sur char initialise avec l'adresse du premier element d'un tableau de char */
   char *p = s;
 

Citation :


heu ...et quand on dit  

Code :
  1. char const *p


est-ce pareil que  

Code :
  1. const char *p




Oui.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1240578
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 16:37:09  profilanswer
 

in_your_phion a écrit :

haa .. alors je crois que je commence vaguement a comprendre. Mais alors du coup, pourquoi une constante n'a pas d'adresse ?


Je me tue à te dire que par définition, une constante n'a pas d'adresse.. C'est un axiome, une affirmation, ça ne ce démontre pas. C'est comme ça, c'est tout. Si ça a une adresse, c'est un objet.

Citation :


ca veut dire que char p[6] n'a pas d'adresse ????  


Gné ? Tu trouves que char p[6], ça a une tronche de constante ? C'est un tableau de char, et il a une adresse. (je te fais grâce de son type, qui n'est pas char*)

Citation :

et le symbole "&" ca sert quand meme pour les constantes, non ?


Ben non. Essaye, tu te prends une erreur de syntaxe.


#include <stdio.h>
 
int main (void)
{
   printf ("Adresse de 10  = %p\n", &10);
   
   return 0;
}



../main.c: In function `main_':
../main.c:5: error: invalid lvalue in unary `&'

Message cité 1 fois
Message édité par Emmanuel Delahaye le 07-11-2005 à 16:42:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1240579
in_your_ph​ion
Posté le 07-11-2005 à 16:37:43  profilanswer
 

Emmanuel Delahaye a écrit :

Non, c'est autre chose. Tu confonds pointeur et tableau.
 
On peut faire ça :  
 
/* tableau de char initialise */
   char s[] = "bonjour";
 
/* pointeur sur char initialise avec l'adresse du premier element d'un tableau de char */
   char *p = s;
 


 
bah ...ça je comprend. Ce que je comprend moins c'est de dire  

Code :
  1. char *p = "bonjour";


vu que on est censé donner une adresse, comme dans ton exemple quand on fait  

Code :
  1. char *p = s;


 
...
 
 

Citation :


heu ...et quand on dit  

Code :
  1. char const *p


est-ce pareil que  

Code :
  1. const char *p




 
ok merci


Message édité par in_your_phion le 07-11-2005 à 16:40:26
n°1240584
in_your_ph​ion
Posté le 07-11-2005 à 16:43:46  profilanswer
 

Emmanuel Delahaye a écrit :

Je me tue à te dire que par définition, une constante n'a pas d'adresse.. C'est un axiome, une affirmation, ça ne ce démontre pas. C'est comme ça, c'est tout. Si ça a une adresse, c'est un objet.

Citation :


ca veut dire que char p[6] n'a pas d'adresse ????  


Gné ? Tu trouves que char p[6], ça a une tronche de constante ? C'est un tableau de char, et il a une adresse. (je te fais grâce de son type, qui n'est pas char*)

Citation :

et le symbole "&" ca sert quand meme pour les constantes, non ?


Ben non. Essaye, tu te prends une erreur de syntaxe.


#include <stdio.h>
 
int main (void)
{
   printf ("Adresse de 10  = %p\n", &10);
   
   return 0;
}



../main.c: In function `main_':
../main.c:5: error: invalid lvalue in unary `&'



 
ok, mais quand je fais :  
 

Code :
  1. #include <stdio.h>
  2. int main () {
  3. int a =10;
  4. printf ("%p\n",&a);
  5. return 0;
  6.  
  7. }


 
 
j'ai pas d'erreur, et pourtant a est une constante, nan  :??:

Message cité 1 fois
Message édité par in_your_phion le 07-11-2005 à 16:44:34
n°1240588
blackgodde​ss
vive le troll !
Posté le 07-11-2005 à 16:46:11  profilanswer
 

non, a n'est pas une constante.


---------------
-( BlackGoddess )-
n°1240592
in_your_ph​ion
Posté le 07-11-2005 à 16:50:57  profilanswer
 

blackgoddess a écrit :

non, a n'est pas une constante.


 
 :cry: sadique !

n°1240595
blackgodde​ss
vive le troll !
Posté le 07-11-2005 à 16:53:37  profilanswer
 

quand tu ecris char *p = "bonjour"; ce n'est pas p qui est constant, c'est la chaine pointée qui l'est.
 
edit : ou tout du moins qui devrait l'etre.

Message cité 1 fois
Message édité par blackgoddess le 07-11-2005 à 16:54:24

---------------
-( BlackGoddess )-
n°1240696
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 18:58:54  profilanswer
 

blackgoddess a écrit :

quand tu ecris char *p = "bonjour"; ce n'est pas p qui est constant, c'est la chaine pointée qui l'est.
 
edit : ou tout du moins qui devrait l'etre.


Non, elle n'est pas constante. Elle est non modifiable. Merci de ne pas confondre 'expression constante' et 'objet non modifiable'. C'est ce que je me tue à essayer d'expliquer au P.O...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1240701
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 19:06:12  profilanswer
 

in_your_phion a écrit :


Code :
  1. #include <stdio.h>
  2. int main () {
  3. int a =10;
  4. printf ("%p\n",&a);
  5. return 0;
  6.  
  7. }


j'ai pas d'erreur, et pourtant a est une constante, nan  :??:


Non (manque un void*). a n'est certainement pas une constante, la preuve, c'est que tu a résussi à prendre son adresse, preuve que c'est une objet.  
Ce code fonctionne aussi :


#include <stdio.h>
 
int main ()  
{
   int a;
   printf ("%p\n", (void*) &a);
 
   return 0;
}


C'est un objet de type int initialisé avec une valeur. C'est la valeur en elle même qui est une constante. Mais une fois qu'elle a été copiée dans la variable, celle-ci (la variable) ne devient pas magiquement une constante, même si on ajoute le mot clé 'const', qui, rappelons-le une ènième fois, transforme un objet modifiable en un objet non modifiable.  
 
Mais ça reste un objet. Certainement pas une constante. Je rappelle qu'une constante n'a pas d'adresse et n'est donc pas un objet.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  copie d'une chaine de caractères

 

Sujets relatifs
Exécuter une chaîne de caractère en PL/SQLCouper chaîne de caractère
init d'un dict à partir d'une chaîne de caractère [résolu]fonction pour recuperer un chiffre d'une chaine [Résolu]
probleme minute: fonction chaine en php(Résolu) - Caractères acceptés dans un champ par MySQL
remplacer une chaine de caractere dans un fichier en .bat[résolu] pb longueur de chaîne avec dbi:PgPP
wtring et caracteres unicode hexatous les caracteres utf8
Plus de sujets relatifs à : copie d'une chaine de caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR