Language C

dancingmad -  
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

dans un soucis de clarification d'un code source en C, je cherche a definir une constante, LG_STR, qui represente la longueur d'une chaine de caractere standard. Je l'ai donc naturellement definie comme ceci:

#define LG_STR 32

et j'ai remplac'e le nombre 32 par LG_STR dans tout le prog.

Le probleme est que je n'arrive pas a le faire directement dans un scanf:

char s[LG_STR];
scanf("%LG_STRs",s); /* ne compile pas */

et j'ai beau chercher, je ne trouve pas la synthaxe a utiliser pour le faire.

J'ai pens'e creeer une fonction qui renvoie la bonne chaine de caractere, avec un fscanf, mais je voudrais que l'operation se fasse a la compilation. Y a-t-il un moyen ?

Merci d'avance.

ps: desol'e pour les accents, clavier qwerty oblige...

5 réponses

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Le premier argument de scanf, qui précise le type de ce qui sera entré, c'est soit %s (chaine de caractère), %d (pour un entier), %f (flottant) etc... Mais dans ton code ça donne %32 ce qui n'a pas de sens. Remplace %LG_STR par %s
0
dancingmad
 
Oui, ca marche, mais dans ce cas, on risque d'avoir un depassement de memoire si l'utilisateur entre une chaine de caractere trop longue...

Ce que je veux, c'est juste ecrire

scanf("%xxs",s);

avec la valeur decimale de xx egale a LG_STR, sans avoir a l'entrer a la main.
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ah oui d'accord, faut faire précéder ta variable du signe dièse pour la conversion d'une constante préprocesseur en chaine:
scanf("%" #LG_STR "s",s); 

Ce qui donnera après le traitement du préprocesseur:
scanf("%" "32" "s",s);

Ce qui donnera après le passage du compilateur:
scanf("%32s",s);

Voilà ça devrait marcher.
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
J'avour que je suis pas trop sûr de moi sur ce coup là. Sinon essaie ça:
#define MON_PRINTF(l,s) printf("%" #l "s", s)

MON_PRINTF(#LG_STR, chaine);
0
dancingmad
 
Merci beaucoup !

C'est la 2e solution qui marche. Et on peut mettre ou non le # devant LG_STR dans l'appel de la macro.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ah oui au moment de l'appel de la macro j'ai mis le dièse mais j'ai pas fait exprès, normalement faut pas le mettre.
0