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 :

extraire des (char) puis créer un long int avec


Sujet :

C

  1. #1
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut extraire des (char) puis créer un long int avec
    Bonjour,

    Je cherche une méthode pour corriger automatiquement une connerie de saisie utilisateur.

    exemple :
    l'utilisateur a saisie 1234ddddd55rrrrrrr5
    et en corrigeant automatiquement on traite 1234555
    comme si il n'était pas dyslexique du clavier quoi.


    je pensais faire quelque chose comme ça parceque j'ai pas trouvé dans le fichier string.h de méthode toute faite pour celà.

    comparer et voir si il y a que des chiffres
    sinon lancer le bloc suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for(i=0;i<strlen(buffer);i++)
    {
        switch(buffer[i])
            {
                 case '0' :
                     strcat(buffer2[i],buffer[i]);
                  break ;
                                // .... etc ... pour les 10 chiffres
                  default : 
                              // ne rien faire
                  break;
            }
    }
    P.saisie=stroul(&buffer2, NULL, 10)
    Est ce que ce code fonctionnerai ?
    Si oui comment l'améliorer ?

    Si une meilleure méthode, existe merci de m'indiquer, parce que là je tourne en rond et j'arrive pas à trouver de méthode ni d'exemples proches de mon cas, sur lesquels m'appuyer.


    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parcours de chaîne avec suppression de caractères.
    J'aime bien ce problème, car il est relativement facile: Pas besoin de taille de buffer (toujours inférieure ou égale à la taille de la chaîne de départ) et on peut s'en servir avec chaineDépart == chaineArrivee...

    Version en incrémentant directement les pointeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void SupprimeNonChiffre(char *szDest, char const *sczSrc)
    {
    for( ; *sczSrc != '\0' ; sczSrc++ )
    	{
    	char c = *sczSrc;
    	int ic = (int)(unsigned char)c; /* isdigit() réclame un int */
    	if(isdigit(ic))
    		{
    		*szDest = c;
    		szDest++;
    		}
    	}
    *szDest = '\0';
    }
    Version avec des index:
    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
    void SupprimeNonChiffre2(char * const szDest, char const * const sczSrc)
    {
    size_t i,j;
     
    for(i=0,j=0 ; sczSrc[i] != '\0' ; i++ )
    	{
    	char c = sczSrc[i];
    	int ic = (int)(unsigned char)c; /* isdigit() réclame un int */
    	if(isdigit(ic))
    		{
    		szDest[j] = c;
    		j++;
    		}
    	}
    szDest[j] = '\0';
    }
    Ces fonctions, tu peux les utiliser soit avec sczSrc pointant sur une chaîne constante et szDest sur un buffer de la même taille, soit avec sczSrc et szDest pointant sur le même buffer...
    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.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Moi je l'aurais fait avec une boucle while, et en modifiant la chaîne initiale
    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
     
    char *nettoie(char *src)
    {
        char *but = src;
        while (*src != 0)
        {
            int ic = (int)(unsigned char)*src;
            if(isdigit(ic))
    	{
    	    *but++ = *src;
    	}
    	src++;
        }
        *but = *src; 
        return but;
    }
    J'aime pas les boucles for.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    ah d'accord j'ai compris.

    merci
    je vais suivre vos conseils ça va me faciliter la vie j'aurai juste à faire apres la conversion une fois la chaine valide.

    merci


    joie

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	int ic = (int)(unsigned char)c; /* isdigit() réclame un int */
    Pourquoi faire aussi compliquer ?

    fonctionne bien.
    De meme, sauf erreur de ma part,

    fonctionne correctement

    Citation Envoyé par Trap D
    Moi je l'aurais fait avec une boucle while, et en modifiant la chaîne initiale

    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
    char *nettoie(char *src) 
    { 
       char *but = src; 
       while (*src != 0) 
       { 
          int ic = (int)(unsigned char)*src; 
          if(isdigit(ic)) 
          { 
             *but++ = *src; 
          } 
          src++; 
       } 
       *but = *src; 
       return but; 
    }
    la ligne return but est etrange, ici tu retourne un pointeur sur le \0 de fin de chaine, ce qui n'a pas grande utilite.

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Oui gl, tout à fait (ça m'apprendra à ne pas tester)
    Par contre, avec Visual C 2005 isdigit(*src) plante avec des lettres accentuées,
    il faut absolument mettre isdigit((int) (unsigned char)*src))
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Et oui.
    La norme ne définit isdigit() que pour des nombres supérieurs à zéro, c'est ici même que je l'ai lu...

    Quand on travaille en wchar_t, je ne sais pas s'il y a une garantie par contre. Tout ce que je sais, c'est que unsigned wchar_t n'existe pas (erreur de compilation).

    Et quand on travaille en TCHAR sous Windows, on doit utiliser le type _TUCHAR déclaré dans <tchar.h>...
    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.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Trap D
    Par contre, avec Visual C 2005 isdigit(*src) plante avec des lettres accentuées,
    il faut absolument mettre isdigit((int) (unsigned char)*src))
    Au temps pour moi, j'avais oublie ce cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Selectionner un doc puis créer son lien hypertexte avec une userform
    Par Soja-GroB dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/10/2017, 13h25
  2. Problème affichage long long int avec %lld
    Par Yunchi dans le forum Débuter
    Réponses: 11
    Dernier message: 24/03/2009, 10h19
  3. [Débutante] Extraire des données à partir d'un fichier html avec xsl
    Par sab_etudianteBTS dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/03/2008, 09h10
  4. Réponses: 5
    Dernier message: 06/02/2008, 16h01
  5. Problème de buffer avec des int et des char
    Par Lolita59 dans le forum Réseau
    Réponses: 23
    Dernier message: 04/05/2006, 11h09

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