IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

printf et scanf : taille des paramètre paramètrable.


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut printf et scanf : taille des paramètre paramètrable.
    Bonjour,
    Je ne sais plus comment, mais j'ai découvert avec bonheur qu'il y avait moyen de paramétrer la taille des paramètres d'un printf. Je m'explique :
    Habituellement j'écrivais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(pstream, "%3.2f", fval);
    Ça avait pour effet d'écrire un flottant dans un fichier avec 2 chiffres après la virgule.
    Je voulais rendre le nombre de chiffres paramétrable, très utile lors des export ASCII. Et c'est là où j'ai découvert l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(pstream, "%*.*f", ntot, ndec, fval);
    qui permet d'écrire un flottant avec "ndec" décimales.
    J'étais au anges.

    Maintenant je veux faire l'inverse ; lire à partir d'un char* des paramètres avec des tailles variables.
    No problemo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(pbuff, "%*s%*.*f", nchar, ch, ntot, ndec, &fval);
    Ah que nini, marche pas.

    J'ai cherché et rien trouver.
    Je me tourne vers vous, une idée ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 899
    Points : 219 808
    Points
    219 808
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Citation Envoyé par tazer Voir le message
    Maintenant je veux faire l'inverse ; lire à partir d'un char* des paramètres avec des tailles variables.
    No problemo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(pbuff, "%*s%*.*f", nchar, ch, ntot, ndec, &fval);
    Ah que nini, marche pas.

    J'ai cherché et rien trouver.
    Je me tourne vers vous, une idée ?
    En fiat, vous compliquez un peu .

    %s: Représente une chaine de caractères qui utilise comme limitateur un espace, ou la fin de la chaine de caractère source. L'étoile ne sert pas à grand chose... ( enfin elle sert à rien d'ailleurs et cela ne doit pas beaucoup compilé ( du moins, il doit y avoir des warnings ).
    %f représente un nombre en virgule flottante. Si dans la source, le nombre est représenté comme 2.3, il va lire 2.3. Si la représentation est différente, il va lire cela la représentation.
    Donc les étoiles sont aussi inutile. ( Enfin je trouve que cela n'a aucun sens ... )

    J'espère que vous m'avez compris ... car j'ai peur de ne pas être clair. N'hésitez pas à poser des questions

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Bonjour,
    LittleWhite, Je comprend votre réponse et t'en remercie.
    Ma chaine de départ est de la forme "SID1.58962", pour ne rien te cacher c'est la réponse d'une balance via rs232. La chaine ne contient pas de blanc.
    Le soucis ici c'est qu'on a une balance qui répond SID... et une autre qui répond SI.... et je veux rendre paramétrable le nombre de caractères du début.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 899
    Points : 219 808
    Points
    219 808
    Billets dans le blog
    125
    Par défaut
    Ce que vous pouvait tenté de faire, c'est lire la chaine de caractère, caractère par caractère.
    Lorsque vous voyez que c'est une lettre, vous la sauvegardez dans un char* prévu pour ça ( pour pouvoir réutilisé / comparé plus tard ). Et dès que vous tombé sur un chiffre, vous prennez votre pointeur est vous utilisé sscanf pour convertir le float.

    Je pense que cela devra suffire. Je n'ai pas compris pourquoi la balance 2 ne renvoie que SI...

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour la famille scanf, l'étoile sert à supprimer le stockage, donc à sauter un champ en lecture
    Ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char buffer[] = "valeur 123.456";
    double f;
    sscanf(buffer, "%*s%lf", &f); // f prend la valeur 123.456
                                 // la sous-chaine "valeur" est ignorée
    Dans ton problème, regarde si le format %[] ne peut faire ton affaire. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char buffer1[] = "SID1.58962";
    char buffer2[] = "SI1.58962";
    char res[10]  ;
    double f;
    sscanf(buffer1, "%[A-Za-z]%lf", res, &f); //res = "SID", f = 1.58962
    sscanf(buffer2, "%[A-Za-z]%lf", res, &f); //res= "SI" , f = 1.58962

Discussions similaires

  1. Taille des paramètres chargés en dll limitée ?
    Par La Fée Dragée dans le forum MATLAB
    Réponses: 0
    Dernier message: 17/07/2009, 15h31
  2. Réponses: 9
    Dernier message: 25/11/2008, 16h44
  3. Réponses: 0
    Dernier message: 03/12/2007, 12h28
  4. problèmes pour faire des états paramétrés sur vb6
    Par k_alexis dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 16/10/2007, 18h59
  5. Réponses: 3
    Dernier message: 22/01/2007, 00h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo