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

Visual C++ Discussion :

vsscanf : traduction microsoft ?


Sujet :

Visual C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut vsscanf : traduction microsoft ?
    Bonjour

    J'ai une routine qui tourne sous Linux, mais elle plante sous Visual C++
    En effet, Visual ne connait pas vsscanf

    Voici la routine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    lectureclavierf(char const *format, ...)
    {
     int n=0;
     char * chn;
     va_list va;
     va_start (va, format);
     
     if ((chn=lectureclavier())!=NULL)
     {
      n = vsscanf(chn, format, va);
      va_end(va);
      free(chn);
     }
     return n;
    }
    Et voici les explications de vsscanf :
    Citation Envoyé par man vsscanf
    SCANF(3) Manuel du programmeur Linux SCANF(3)

    NOM
    scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - Entrées formatées.

    SYNOPSIS
    #include <stdio.h>
    [...]
    int vsscanf (const char * str, const char * format, va_list ap);
    [...]
    [...]La fonction vscanf examine
    l'entrée standard en utilisant une liste variable d'arguments pointeurs
    et la fonction vsscanf examine une chaîne. Elles sont respectivement
    analogues aux fonctions vprintf et vsprintf.
    Comment puis-je la remplacer ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut, voir cet article

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu as verifié que ta chaine chn fournit une longueur suffisante (\0) compris pour le format spécifié ?.
    au vu de ton code ,rien n'empêche un débordement mémoire...

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par nico-pyright(c)
    salut, voir cet article
    On dirait un code à rajouter pour faire tout de même tourner vsscanf. Ça veut donc dire qu'il n'y a rien d'équivalent ! Mais je ne comprends pas bien la licence !

    Citation Envoyé par farscape
    tu as verifié que ta chaine chn fournit une longueur suffisante (\0) compris pour le format spécifié ?.
    au vu de ton code ,rien n'empêche un débordement mémoire...
    Mon seul but était de vider le bukffer clavier en faisant un scanf.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    d'ailleurs je connais vsprintf mais pas vsscanf , il n'apparait ni dans MSDN ni dans l'aide de visual 2005.
    tu le sors d'ou ?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par troumad
    Mon seul but était de vider le bukffer clavier en faisant un scanf.
    tu ne reponds pas a ma question.

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par farscape
    d'ailleurs je connais vsprintf mais pas vsscanf , il n'apparait ni dans MSDN ni dans l'aide de visual 2005.
    tu le sors d'ou ?
    http://www.linux-france.org/article/...3/scanf-3.html
    Citation Envoyé par farscape
    tu ne reponds pas a ma question.
    Si... J'ai dit que je ne me suis pas préoccuppé de ce problème. Mon seul but était de vider le buffer afin, par exemple de pouvoir faire un scanf("%c",&c); après. Les choses les unes après les autres !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je ne vois pas d'équivalence C à cette fonction chez MS...
    en c++ on ecrit ça pour la consôle:
    http://c.developpez.com/faq/cpp/?pag...e#SL_cin_clear

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    sinon Nicolas à repondu et fournit un lien sur codeguru qui montre comment implementer cette fonction sous windows...
    [edit]
    cette solution implique l'utilisation des MFC,
    l'autre solution consiste à sortir la fonction input dans le source input.c
    pour la définir en vsscanf.
    la fonction input étant static dans la crt
    [/edit]

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En fait, je ne suis même pas sûr que vsscanf() existe pour tous les Linux: L'aide n'indique aucun standard pour cette fonction, ni ANSI ni POSIX...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    STANDARDS
    Les fonctions fscanf, scanf, et sscanf sont conformes à ANSI C3.159-1989 (``C ANSI'').
    pas de vsscanf en vue...
    il y a du linge sur la corde à linge

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Ma solution pour vsscanf
    Bonjour,

    Cette absence de vsscanf() est vraiment trop bête, que ce soit la norme ou pas!

    Comme j'en ai eu besoin, je me suis fait mon propre vsscanf(), ainsi que vscanf() et vfscanf(), mais je n'ai testé que la première de ces fonctions. Sous Visual Studio 8.0, ça fonctionne. J'utilise sscanf() et les fonctions analogues, en coupant la chaîne de format pour avoir un seul champ converti à chaque fois.

    Pour ceux qui veulent!

    MJ (Montpellier)


    Entêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int vsscanf(const char *str, const char *format, va_list arg_list);
    int vscanf(const char *p_format, va_list arg_list);
    int vfscanf(FILE *f, const char *p_format, va_list arg_list);
    Code C++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "stdafx.h"
     
    #include <stdio.h>
    #include <stdarg.h>
    #include <string.h>
    #include <malloc.h>
     
    static int vscanf_generic(const char *str, FILE *fd, const char *p_format, va_list arg_list){
        char *nformat = strdup(p_format);
        char *format = nformat;
        int i;
        int n=0;
        int convtot=0;
        int conv=EOF;
        for (i=0; format[i]; i++){
            if (format[i] == '%'){
                if (format[i+1] == '%' || format[i+1] == '*' || format[i+1] == '\0')
                    i++; // pas compté comme variable à allouer, je saute
                else { // c'est une variable
                    if (n==0) // première variable: OK
                        n++; 
                    else { // deuxième variable: on coupe juste avant
                        char f[3];
                        f[1]=format[i+1]; f[2]=format[i+2];
                        format[i+1]='n'; format[i+2]='\0';    // %n = nombre de caractères lus dans l'entrée
                        void *p = va_arg(arg_list, void *);
                        int lu=-1,conv;
                        conv = (str ? sscanf(str, format, p, &lu) : 
                            fd ? fscanf(fd, format, p, &lu) :
                            scanf(format, p, &lu) );
                        if (lu==-1){ // échec à la conversion
                            convtot += (conv>=0 ? conv : 0); // peut-être converti quand même une variable?
                            break; // mais ensuite on arrête
                        }
                        convtot++; // une variable lue
                        if (str)
                            str += lu; // avancer dans l'entrée
                        format[i+1]=f[1]; format[i+2]=f[2]; // rétablir la chaîne de format
                        format += i; i = -1; // avancer dans le format
                        n=0; // on repart avec 0 variable détectée dans la nouvelle chaîne
                    }
                }
            }
        }
        if (format[i]=='\0' && n>0) { 
            // on est arrivé au bout, et il reste une variable à convertir
            void *p = va_arg(arg_list, void *);
            int conv;
            conv = (str ? sscanf(str, format, p) : 
                            fd ? fscanf(fd, format, p) :
                            scanf(format, p) );
            convtot += (conv>=0 ? conv : 0);
        }
        free(nformat);
        return (convtot>0 ? convtot : conv);
    }
     
    int vsscanf(const char *str, const char *p_format, va_list arg_list){
        // fonction qui curieusement n'existe pas chez Microsoft
        return vscanf_generic(str, NULL, p_format, arg_list);
    }
     
    int vscanf(const char *p_format, va_list arg_list){
        // fonction qui curieusement n'existe pas chez Microsoft
        return vscanf_generic(NULL, NULL, p_format, arg_list);
    }
     
    int vfscanf(FILE *fd, const char *p_format, va_list arg_list){
        // fonction qui curieusement n'existe pas chez Microsoft
        return vscanf_generic(NULL, fd, p_format, arg_list);
    }

Discussions similaires

  1. Microsoft présente son outil de traduction Skype quasiment en temps réel
    Par Stéphane le calme dans le forum Actualités
    Réponses: 36
    Dernier message: 12/12/2016, 21h50
  2. Réponses: 1
    Dernier message: 28/06/2013, 19h36
  3. Microsoft Press France : traductions incomplètes
    Par Johan Buret dans le forum Certifications
    Réponses: 0
    Dernier message: 20/11/2008, 16h06
  4. J'aime la traduction Automatique de Microsoft
    Par totojordi dans le forum La taverne du Club : Humour et divers
    Réponses: 4
    Dernier message: 18/06/2008, 15h59
  5. Traduction
    Par PierDIDI dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/09/2002, 23h43

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