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 :

Chaine de caracteres


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut Chaine de caracteres
    Je voudrait detecter des valeurs numeriques au milieu de chaine de caractère. La fonction isdigit detecte si un caractere lu est numerique.

    Existe t'il une fonction equivalente à isdigit en C mais pour une chaine de caractere je n'ai rien trouvé la dessus...

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut Re: Chaine de caracteres
    Citation Envoyé par Nalido
    Je voudrait detecter des valeurs numeriques au milieu de chaine de caractère. La fonction isdigit detecte si un caractere lu est numerique.

    Existe t'il une fonction equivalente à isdigit en C mais pour une chaine de caractere je n'ai rien trouvé la dessus...
    Tu peux tenter sscanf ou strtol.

    man sscanf
    man strtol

    pour plus de renseignements.

  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
    ce que tu peux faire, tu parcours ta chaine avec isdigit, et dès que tu as trouver le premier caractère numérique, tu utilises la fonction strtol à partir de ce caractère, l'argument **endptr permet de savoir où s'est arrêtée la conversion.
    "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
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Nalido
    Existe t'il une fonction equivalente à isdigit en C mais pour une chaine de caractere je n'ai rien trouvé la dessus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <ctype.h>
     
    int isalpha(int c);
    A utiliser caractere par caractere, de la meme facon que isdigit().

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    Je pense que strtol doit repondre à mes attentes je vais essayer de coder pour voir ce que cela donne mon but etant d'identifier au milieu de texte des valeurs numeriques du genre 10e+3 ou 10k. isdigit ne convient pas car il fonctionne caractere par caractere de meme que isalpha.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nalido
    Je pense que strtol doit repondre à mes attentes je vais essayer de coder pour voir ce que cela donne mon but etant d'identifier au milieu de texte des valeurs numeriques du genre 10e+3 ou 10k. isdigit ne convient pas car il fonctionne caractere par caractere de meme que isalpha.
    Si il s'agit de convertir "10e+3" en valeur numérique, strtod() le fait diréctement...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    J'ai décidement vraiment du mal avec le C.
    Strtol ou strtod me permettent de convertir une chaine en long ou en float...
    Ce que je veut c'est detecter une valeur numerique exactement comme le fait is digit mais au lieu que ce soit un caractère je veut le faire sur un mot.

    J'ai ecrit une fonction qui me permet de decomposer mon fichier grace a strtok. Et je veut tester si mon token est un chiffre ou pas sachant que mon token est un mot et pas un caractere.
    j'ai essayé avec strtol et strtod mais je n'obtient pas ce que je souhaite.

    merci de votre aide

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nalido
    J'ai ecrit une fonction qui me permet de decomposer mon fichier grace a strtok. Et je veut tester si mon token est un chiffre
    Tu veux dire un nombre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
          /* Filtrage des caracteres (entier decimal)
           * Nota : la saisie s'arrete a la premiere erreur.
           * Ce qui est saisi avant est considere comme valide.
           *
           * "123a" -> "123" : ret = 1
           *
           * "a123" -> ""    : ret = 0
           */
          ret = sscanf (saisie, "%[0-9-]s", temp);
    tiré d'un exemple complet ici :

    http://emmanuel-delahaye.developpez....tes.htm#saisie

    mais le comportement est très comparable à strtol(), si on utilise le 2ème paramètre...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    On avance doucement mais on avance...
    Je recupere un ligne de mon fichier que je decompose avec strtok pour separer les nombres (mes separateurs etant =, /n...)
    Ensuite je fais sscanf de token pour formater chaque mot recupéré

    le problème c'est que mes valeurs sont ecrites sous forme de float donc 10.00e+15
    donc le point qui separe 10 et 00 par exemple empeche le formatage correcte car apres mon strtol je recupere seulement le 10...

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nalido
    le problème c'est que mes valeurs sont ecrites sous forme de float donc 10.00e+15
    Qu'est-ce qui ne va pas avec
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
       char const s[] = "10.00e+15";
     
       double n = strtod (s, NULL);
     
       printf ("n = %.2f\n", n);
       printf ("n = %g\n", n);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    n = 10000000000000000.00
    n = 1e+016

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    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
    #include <stdio.h> 
    #include <stdlib.h> 
    #define BUFFSIZE 256
     
    int main(void) 
    { 
       char const chaine[] = "CAL_KJL  =  1.0000000e+001 . (tolerance )"; 
       char seps[]   = " ,\t\n=";
       char *token;
       int ret;
       char temp[BUFFSIZE];
     
    	token = strtok( chaine, seps );
     
        while( token != NULL ) {
            // While there are tokens in "string" 
    		printf( " %s\n", token );
    		ret = sscanf (token, "%[0-9-]s",temp);
    		if (ret!=0){
    			double n = strtod (chaine, NULL); 
    			printf ("n = %.2f\n", n); 
    			printf ("n = %g\n", n); 
    		}
    		token = strtok( NULL, seps );
    	}
     
       return 0; 
    }
    je ne comprend pas pourquoi il me donne n=0.00

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    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
    #include <stdio.h> 
    #include <stdlib.h> 
    #define BUFFSIZE 256
     
    int main(void) 
    { 
       char const chaine[] = "CAL_KJL  =  1.0000000e+001 . (tolerance )"; 
       char seps[]   = " ,\t\n=";
       char *token;
       int ret;
       char temp[BUFFSIZE];
       double n;
     
    	token = strtok( chaine, seps );
     
        while( token != NULL ) {
            // While there are tokens in "string" 
    		printf( " token vaut:%s\n", token );
    		ret = sscanf (token, "%[0-9-]s",temp);
    		printf("temp vaut: %g\n",temp);
    		if (ret!=0){
    			double n = strtod (temp, NULL); 
     
    		}
    		printf ("n = %.2f\n", n); 
    		printf ("n = %g\n", n);
    		token = strtok( NULL, seps );
    	}
     
       return 0; 
    }

    J'ai placé quelques printf et je m'aperçois que sscanf ne fait pas vraiment ce que je veut...

    LA valeur temp ne change jamais???

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nalido
    je ne comprend pas pourquoi il me donne n=0.00
    Que de complications inutiles...
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
       char const chaine[] = "CAL_KJL  =  1.0000000e+001 . (tolerance )";
       int ret;
     
       char *p = strchr (chaine, '=');
     
       if (p != NULL)
       {
          double n = strtod (p + 1, NULL);
          printf ("n = %.2f\n", n);
          printf ("n = %g\n", n);
       }
     
       return 0;
    }

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    C bon g trouvé mon erreur ,

    Je faisit sscanf pour formater mon token et si il retourne 1 cela signifie qu'il a pu formater
    alors je doit recuper token avec strtod et non pas le resultat du scanf

    merci pour votre aide

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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