Language C

Fermé
dancingmad - 4 avril 2008 à 16:21
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 4 avril 2008 à 17:18
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 avril 2008 à 16:28
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
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 avril 2008 à 16:46
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 avril 2008 à 16:52
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
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 avril 2008 à 17:18
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