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 éminent sénior 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 : 47
    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
    Points : 12 262
    Points
    12 262
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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...

  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
    Points : 6 498
    Points
    6 498
    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.

  4. #4
    Expert éminent sénior 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 : 47
    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
    Points : 12 262
    Points
    12 262
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    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
    Points : 6 498
    Points
    6 498
    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))

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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>...

  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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    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