[débutant][questionalacon] scanf et chaîne de caractères

[débutant][questionalacon] scanf et chaîne de caractères - C - Programmation

Marsh Posté le 22-11-2008 à 22:07:49    

J'ai juste une petite question qui grille mes quelques neurones encore présents :
 
Pourquoi lorsque l'on met une chaîne de caractères ( appelons-là chaine ) en paramètre d'un scanf faut-il mettre  
 

Code :
  1. scanf("%s", chaine)


 
et non
 

Code :
  1. scanf("%s", &chaine)


 
?
 
&chaine n'est pas une adresse ?
 
Malgré un warning , la 2eme version compile et fonctionne...
 
Merci d'éclairer ma lanterne.


Message édité par toji le 22-11-2008 à 22:09:17
Reply

Marsh Posté le 22-11-2008 à 22:07:49   

Reply

Marsh Posté le 22-11-2008 à 22:41:47    

Ca dépend de ce qu'est la variable chaine. Si c'est un pointeur de type char* alors "chaine" est déjà une adresse, inutile de rajouter &.

Reply

Marsh Posté le 22-11-2008 à 22:46:35    

C'est une chaîne de caractères.
 
Donc quelque chose de la forme  
 

Code :
  1. char chaine[50]


Reply

Marsh Posté le 22-11-2008 à 22:49:06    

Ok donc même si ça n'est pas exactement la même chose, on est dans le même cas: chaine contient l'adresse du 1er caractère de ta chaine.

Reply

Marsh Posté le 22-11-2008 à 23:03:29    

ok... je m'embrouille parce que chaine peut aussi désigner la chaîne de caractères dans son intégralité. ( avec un printf("%s",chaine) )
 
Mais tu es d'accord que &chaine donne aussi l'adresse du premier caractère de la chaîne ? ( je l'ai d'ailleurs vérifié avec un printf )
 
Ca serait différent si ma variable chaine était un pointeur de type char* ?

Reply

Marsh Posté le 22-11-2008 à 23:37:57    

Oui il me semble que pour un tableau, avec ou sans & on obtient l'adresse du 1er élément. Pourquoi je ne sais pas.

Reply

Marsh Posté le 23-11-2008 à 10:57:54    

Parce que c'est la norme C qui le veut, y a pas a chercher plus loin.
 
Aprés je te dirais qu'utilsiez scnaf quand ce genre de fondamentaux n'est aps acquis, c'est aimé se faire fesser avec un martinet à clous. fgets est plus adaptée et permet pus de controle. La , je vois le PO revenir demain en disant "ouais mon scanf bug, il mange pas les espaces".

Reply

Marsh Posté le 23-11-2008 à 11:23:40    

ngkreator a écrit :

Oui il me semble que pour un tableau, avec ou sans & on obtient l'adresse du 1er élément. Pourquoi je ne sais pas.


disons que &chaine n'existe pas car il n'y a pas de pointeur vers la chaine en mémoire.
Ca n'aurait pas été plus logique d'interdire cette notation et de retourner une erreur non ?  :??:  
Enfin, si la norme est faite comme ça tant pis.   [:spamafote]


Message édité par sligor le 23-11-2008 à 11:24:33
Reply

Marsh Posté le 23-11-2008 à 11:54:11    

c'est l'inverse : tout comme a->x est le raccourci de (*a).x, dans le cas des tableaux chaine est le raccourci de &chaine[0]. &chaine quant à lui doit *au moins* lever un warning car ca n'ets PAS DU TOUT pareil que &chaine[0]

Reply

Marsh Posté le 23-11-2008 à 11:59:16    

c'est ce que je disais, j'ai dû mal m'exprimer.


Message édité par sligor le 23-11-2008 à 11:59:54
Reply

Marsh Posté le 23-11-2008 à 11:59:16   

Reply

Marsh Posté le 23-11-2008 à 12:00:56    

Je ne sais pas si c'est à moi que tu parles Joel F mais j'essaye justement de comprendre les fondamentaux ( cf tag débutant ) et donc ici  l'adresse (du premier élément) d'une chaîne ou d'un tableau.
 
Je pense que tout débutant commence en utilisant scanf plutôt que fgets...
 
 
sligor :  

Citation :

&chaine n'existe pas car il n'y a pas de pointeur vers la chaine en mémoire.


 
Je ne comprends pas trop cette phrase...Quand on créé une variable , il n'y pas de pointeur vers cette variable en mémoire et pourtant on peut récupérer son adresse via & non?
 
A votre avis , j'ai plutôt rien compris aux pointeurs ou aux tableaux ? ( ou les 2? )

Reply

Marsh Posté le 23-11-2008 à 12:07:40    

toji a écrit :


sligor :  

Citation :

&chaine n'existe pas car il n'y a pas de pointeur vers la chaine en mémoire.


 
Je ne comprends pas trop cette phrase...Quand on créé une variable , il n'y pas de pointeur vers cette variable en mémoire et pourtant on peut récupérer son adresse via & non?
 
A votre avis , j'ai plutôt rien compris aux pointeurs ou aux tableaux ? ( ou les 2? )


Sauf que ici c'est un cas particulier, "chaine" à le même type qu'un pointeur constant vers char.
et chaine n'existe pas en mémoire: seul le tableau de char exist ( chaine vaut &chaine[0])
&chaine serait en toute logique l'adresse d'une case mémoire stockant l'adresse de chaine[0]. Or une tel adresse n'existe pas.

Message cité 1 fois
Message édité par sligor le 23-11-2008 à 12:08:23
Reply

Marsh Posté le 23-11-2008 à 12:10:14    

Aaaaaaaaaaah d'accord.
 
C'est parce que j'ai pris l'habitude d'instancier mes tableaux avec [] j'en avais oublié que c'était des pointeurs.
 
Je pense avoir compris (pour le moment  :fou: ) merci ^^

Message cité 1 fois
Message édité par toji le 23-11-2008 à 12:14:54
Reply

Marsh Posté le 23-11-2008 à 12:27:33    

Ils ont le même type qu'un pointeur constant. Mais la différence c'est justement qu'ils n'existent pas réellement en mémoire.
Seule la donnée vers laquelle ils pointent existe


Message édité par sligor le 23-11-2008 à 12:28:54
Reply

Marsh Posté le 23-11-2008 à 13:58:20    

toji a écrit :


C'est parce que j'ai pris l'habitude d'instancier mes tableaux avec [] j'en avais oublié que c'était des pointeurs.


 
Nooon, un tableau est un tableau, un pointeur est un pointeur !
Ce n'est asp la meme chose ! Ils sont juste compatible au niveau du type

Reply

Marsh Posté le 23-11-2008 à 14:22:13    

Ok [:aha] n'hésitez pas à me reprendre si je dis des grosses conneries

Reply

Marsh Posté le 24-11-2008 à 19:20:46    

Joel F a écrit :

c'est l'inverse : tout comme a->x est le raccourci de (*a).x, dans le cas des tableaux chaine est le raccourci de &chaine[0]. &chaine quant à lui doit *au moins* lever un warning car ca n'ets PAS DU TOUT pareil que &chaine[0]


GCC émet un warning si on passe un mauvais type à scanf() et qu'il est bien réglé. Après je vois pas pourquoi ça devrait être obligatoire. [:petrus dei]
 

sligor a écrit :


Sauf que ici c'est un cas particulier, "chaine" à le même type qu'un pointeur constant vers char.


Pointeur sur tableau de char. [:aloy]


---------------
dap.developpez.com
Reply

Marsh Posté le 24-11-2008 à 20:56:35    

dap++ a écrit :


GCC émet un warning si on passe un mauvais type à scanf() et qu'il est bien réglé. Après je vois pas pourquoi ça devrait être obligatoire. [:petrus dei]


oui, c'est bien ce que je dis non ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed