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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1815401
toji
i am disappoint
Posté le 22-11-2008 à 22:07:49  profilanswer
 

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
mood
Publicité
Posté le 22-11-2008 à 22:07:49  profilanswer
 

n°1815409
ngkreator
Posté le 22-11-2008 à 22:41:47  profilanswer
 

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 &.

n°1815412
toji
i am disappoint
Posté le 22-11-2008 à 22:46:35  profilanswer
 

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

Code :
  1. char chaine[50]


n°1815413
ngkreator
Posté le 22-11-2008 à 22:49:06  profilanswer
 

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.

n°1815416
toji
i am disappoint
Posté le 22-11-2008 à 23:03:29  profilanswer
 

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* ?

n°1815420
ngkreator
Posté le 22-11-2008 à 23:37:57  profilanswer
 

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

n°1815451
Joel F
Real men use unique_ptr
Posté le 23-11-2008 à 10:57:54  profilanswer
 

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".

n°1815461
sligor
Posté le 23-11-2008 à 11:23:40  profilanswer
 

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
n°1815473
Joel F
Real men use unique_ptr
Posté le 23-11-2008 à 11:54:11  profilanswer
 

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]

n°1815477
sligor
Posté le 23-11-2008 à 11:59:16  profilanswer
 

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


Message édité par sligor le 23-11-2008 à 11:59:54
mood
Publicité
Posté le 23-11-2008 à 11:59:16  profilanswer
 

n°1815478
toji
i am disappoint
Posté le 23-11-2008 à 12:00:56  profilanswer
 

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? )

n°1815481
sligor
Posté le 23-11-2008 à 12:07:40  profilanswer
 

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
n°1815483
toji
i am disappoint
Posté le 23-11-2008 à 12:10:14  profilanswer
 

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
n°1815489
sligor
Posté le 23-11-2008 à 12:27:33  profilanswer
 

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
n°1815493
Joel F
Real men use unique_ptr
Posté le 23-11-2008 à 13:58:20  profilanswer
 

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

n°1815495
toji
i am disappoint
Posté le 23-11-2008 à 14:22:13  profilanswer
 

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

n°1816064
dap++
Script kiddie
Posté le 24-11-2008 à 19:20:46  profilanswer
 

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
n°1816114
Joel F
Real men use unique_ptr
Posté le 24-11-2008 à 20:56:35  profilanswer
 

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 ?


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

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

 

Sujets relatifs
Supprimer une partie d'une chaine de caractère.Rajout auto de caractères en fin de ligne d'un txt
Antiflood de caractere dans une chaine et accentStocker un espace dans chaine de caractère
[Résolu] Jeu de caractères[Batch] FOR et concanétion de chaine
[resolu]caracteres accentué (variable TEXT d'une table Mysql)[Delphi]Saisir une chaine de caractères dans un programme extérieur
Débutant, souhaite réaliser fonction simple :) 
Plus de sujets relatifs à : [débutant][questionalacon] scanf et chaîne de caractères


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