Language C

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...
Configuration: Solaris
Firefox 2.0.0.6

5 réponses

  1. Modérateur
    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
    1. 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
  2. Modérateur
    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
    1. Modérateur
      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
      1. 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
        1. Modérateur
          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