OVH Cloud OVH Cloud

Comment lire et afficher un void * ?

8 réponses
Avatar
miniserveur
Comment lire et afficher un void * ?

void *var;

scanf("%?",&var);
printf("%?,var);

Merci

8 réponses

Avatar
Emmanuel Delahaye
----- ----- ----- wrote on 08/12/04 :
Comment lire et afficher un void * ?

void *var;

scanf("%?",&var);


Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des
adresses 'à la main'.

printf("%?,var);


"%p"

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Pierre Maurette
----- ----- ----- wrote on 08/12/04 :

Comment lire et afficher un void * ?

void *var;

scanf("%?",&var);



Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des
adresses 'à la main'.
Si si. Le p du (x)printf() sort sur un format "implémentation defined".

La norme dit que le (x)scanf() utilise le même pour scanner l'entrée
d'un void*.
C99 $7.19.6.2:
p Matches an implementation-defined set of sequences, which should be
the same as the set of sequences that may be produced by the %p
conversion of the fprintf function. The corresponding argument shall be
a pointer to a pointer to void. The input item is converted to a pointer
value in an implementation-defined manner. If the input item is a value
converted earlier during the same program execution, the pointer that
results shall compare equal to that value; otherwise the behavior of the
%p conversion is undefined.
--
Pierre


Avatar
Pierre Maurette
----- ----- ----- wrote:
Comment lire et afficher un void * ?

void *var;

scanf("%?",&var);
printf("%?,var);
Pour l'affichage d'abord. Le %p (et non %P) est fait pour ça. Dans


printf("%p",var);

var doit (devrait) être un void*. Le texte affiché ou généré par
xprintf() est défini par l'implémentation. Par exemple, mais ce n'est
qu'un exemple, il pourra être équivalent à

printf("%08X",var);

Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.
En fait, si la saisie directe d'adresse se conçoit (memory dump par
exemple), c'est plutôt dans un contexte au moins partiellement connu,
dans lequel on pourrait par exemple présumer de la convertibilité de
void* en unsigned int, ou unsigned long, et ainsi assister/sécuriser la
saisie.

S'il s'agit de tests personnels (étudier l'implantation des variables
par exemple), on peut bien entendu faire à peu près n'importe quoi, à
base de %d ou %u.

--
Pierre

Avatar
cedric
Pierre Maurette wrote:
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.


Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos
du scanf :

" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Mais pour relire des sorties formatées avec printf tu pourras."

Il n'y a donc pas de problème à ce que le format du %p ne soit pas
déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par
scanf, pas par un opérateur humain. À condition que l'écriture et la
lecture se fassent sur la même architecture il n'y a donc pas de
problème de portabilité (pour le cas où la portabilité figurait au
cahier des charges de l'OP, ce qui n'est pas précisé).

Amicalement,

Avatar
Pierre Maurette
Pierre Maurette wrote:

Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.



Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos
du scanf :

" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Mais pour relire des sorties formatées avec printf tu pourras."
Oui, mais ça, d'autres se chargent de le rappeler à chaque fil ou

presque sur ce forum. Voilà qui est fait.
La question était dans le ? de scanf("%?",&var);

Il n'y a donc pas de problème à ce que le format du %p ne soit pas
déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par
scanf, pas par un opérateur humain. À condition que l'écriture et la
lecture se fassent sur la même architecture il n'y a donc pas de
problème de portabilité (pour le cas où la portabilité figurait au
cahier des charges de l'OP, ce qui n'est pas précisé).
La question portant sur scanf(), c'est à dire sur fscanf(stdin,), il

faut quand même que l'utilisateur sache si on parle hexa ou décimal.
D'ailleurs, un format tel:
XXXX:XXXX
me semble non seulement possible, mais surtout pas irréaliste du tout.
--
Pierre


Avatar
Vincent Lefevre
Dans l'article <41b80ad6$0$6848$,
cedric écrit:

Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos
du scanf :

" Scanf pour saisir au clavier en aucun cas n'utiliseras,


Pourquoi?

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
cedric
Vincent Lefevre wrote:
" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Pourquoi?



Me souviens plus trop. Une histoire de gestion d'erreur ?
Je me sert jamais de stdio donc j'ai jamais trop lu ces threads.


Avatar
Vincent Lefevre
Dans l'article <41b9a062$0$12917$,
cedric écrit:

Vincent Lefevre wrote:
" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Pourquoi?



Me souviens plus trop. Une histoire de gestion d'erreur ?


scanf est capable de gérer les erreurs quand on l'utilise correctement.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA