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 :

[Debutant] recuperer un chiffre dans un string


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19
    Points : 16
    Points
    16
    Par défaut [Debutant] recuperer un chiffre dans un string
    bonjour,

    je debute en C et je cherche à recuperer un numero contenu dans une chaine de caractere, exemple :

    nom5.domaine.com, je soutaite obtenir : 5
    bob12.domaine.com, je soutaite obtenir : 12

    j'ai un debut de fonction mais je seche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char *get_numsrv(char *str) {
        char *new_s = NULL;
     
        char *pospoint;
        pospoint = strchr(str, '.');
        if (pospoint != NULL) {
            /*  retourner la valeur de l'entier present avant le '.' */
        } else return 0;
    }
     
    /* exemple d'utilisation*/
     sprintf(fichier,"%s/serveur-%d.txt",LOG,get_numsrv(serveur));
    merci pour votre aide !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Points : 33
    Points
    33
    Par défaut
    tu peux parcourir chaque caractère de ta chaine et déterminer si c'est un nombre avec isdigit() .
    Après si les deux indices de deux nombres se suivent tu crée la chaine correspondante et ainsi de suite

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Tes chaînes ne sont censées avoir d'un seul entier ?

  4. #4
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    mets des balises codes !!! y a pas grand chose mais c'est relou à lire...
    juste un truc.
    Pourquoi tu fais ça en C ?
    en script shell / script batch ou script perl ce serait carrément plus court... vive les regexpr :p
    PS : j'espère j'dis pas de conneries mais y en a pas en C non ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    oui, ma chaine ne contiendra qu'un seul entier
    elle commencera toujours par 3 lettres
    xxx{numero}.xxxxx.xxx

    je voit bien comment faire sur le principe, mais en C je seche completement


    EDIT: je prefere en C car ce sera dans un .cgi qui sera appele quelque millions de foit par jour

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Ton élément sera un char * c

    Ton chiffre commencera à partir de c[3]

    Tu déclares par exemple un char temporaire[16];

    Pis tu lis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i = 0;
    while(c[i+3]!='.')
    {
     temporaire[i] = c[i+3]; 
     i++;
    }
    temporaire[i] = '\0';

    Enuiste tu n'as que l'entier, suffit de convertir la variable temporaire (char*) en entier (me rappelle plus de l'instruction, mais qqn va surement ne pas tarder à nous la rappeler).


    Edit : Ah oui, c'est atoi

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Si tu es certain que le nom commence par trois caracteres, alors tu fait simplement:
    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
     
    int get_numsrc(char *str)
    {
       int numsrc = -1;
       if (str)
       {
         char *p;
         numsrc = strtol(str + 3, &p, 10);
         if (*p != '.')
         {
            fprintf(stderr, "No dot after number in %s.\n", str);
         }
      }
      return numsrc;
    }
    Ici, je verifie que le caractere apres le chiffre est bien un point. Il faudrait quand meme s'assurer qu'il n'y a que trois caracteres avant le chiffre...

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par millie
    Edit : Ah oui, c'est atoi
    NON!

    Il faut utiliser strtol

    Jc

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Ca fonctionne très bien chez moi avec atoi.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    #include <iostream>

    int main(int argc, char *argv[])
    {

    int debut_chaine=2; // 3 eme case pas oublier la case 0
    char chaine[] = "abc023.asderf.com",*suiteChaine = NULL;
    char chainefinale[20];
    char chiffre1[2],chiffre2[2],chiffre3[2];
    suiteChaine = strpbrk(chaine, "0123456789");
    chainefinale[0]=suiteChaine[0];
    chiffre1[0]=suiteChaine[1];
    chiffre2[0]=suiteChaine[2];

    strcat(chainefinale, chiffre1);
    strcat(chainefinale, chiffre2);

    printf("chiffre : %s",chainefinale);

    return 0;
    }

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par K4trix
    #include <iostream>

    int main(int argc, char *argv[])
    {

    int debut_chaine=2; // 3 eme case pas oublier la case 0
    char chaine[] = "abc023.asderf.com",*suiteChaine = NULL;
    char chainefinale[20];
    char chiffre1[2],chiffre2[2],chiffre3[2];
    suiteChaine = strpbrk(chaine, "0123456789");
    chainefinale[0]=suiteChaine[0];
    chiffre1[0]=suiteChaine[1];
    chiffre2[0]=suiteChaine[2];

    strcat(chainefinale, chiffre1);
    strcat(chainefinale, chiffre2);

    printf("chiffre : %s",chainefinale);

    return 0;
    }

    Il fallait une fonction renvoyant un int.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    oups dsl voilà

    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 <iostream>
     
    int main(int argc, char *argv[])
    {
     
        int chaine_int;    
        char chaine[] = "abc023.asderf.com",*suiteChaine = NULL;
        char chainefinale[20];
        char chiffre1[2],chiffre2[2],chiffre3[2],*i;
        suiteChaine = strpbrk(chaine, "0123456789");
        chainefinale[0]=suiteChaine[0];
        chiffre1[0]=suiteChaine[1];
        chiffre2[0]=suiteChaine[2];
     
        strcat(chainefinale, chiffre1);
        strcat(chainefinale, chiffre2);
     
        printf("\nchiffre  : %s",chainefinale);
     
        chaine_int=strtol( chainefinale, &i, 10);
     
        printf("\nchiffre  : %ld",chaine_int);
     
        return 0;
    }


    [edit] chez moi sa se compile parfaitement avec codblocks.
    sinon comment je vois si c'est du c ou du c++????

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voici quelques remarques...

    Pas compilable :
    test123.c:3:20: error: iostream: No such file or directory
    test123.c: In function 'main':
    test123.c:9: error: 'NULL' undeclared (first use in this function)
    test123.c:9: error: (Each undeclared identifier is reported only once
    test123.c:9: error: for each function it appears in.)
    test123.c:12: warning: implicit declaration of function 'strpbrk'
    test123.c:12: warning: incompatible implicit declaration of built-in function 'strpbrk'
    test123.c:17: warning: implicit declaration of function 'strcat'
    test123.c:17: warning: incompatible implicit declaration of built-in function 'strcat'
    test123.c:20: warning: implicit declaration of function 'printf'
    test123.c:20: warning: incompatible implicit declaration of built-in function 'printf'
    test123.c:22: warning: implicit declaration of function 'strtol'
    test123.c:24: warning: format '%ld' expects type 'long int', but argument 2 has type 'int'
    test123.c:11: warning: unused variable 'chiffre3'
    test123.c:5: warning: unused parameter 'argc'
    test123.c:5: warning: unused parameter 'argv'
    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <iostream>
    Du C++ pas du C...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        chainefinale[0]=suiteChaine[0];
        chiffre1[0]=suiteChaine[1];
        chiffre2[0]=suiteChaine[2];
    et les '\0'??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        strcat(chainefinale, chiffre1);
        strcat(chainefinale, chiffre2);
    Pour trois caractères, tu trouves pas que t'y vas un peu fort?

    Jc

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par K4trix
    Le seul en tête présent ne devrait pas l'être iostream c'est du C++
    En plus ton code est un peut tordu

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    merci DaZumba,
    ton exemple est parfait, j'ai meme reussi à le comprendre !

  16. #16
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Met en résolu si ça marche

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par alain.lc
    je debute en C et je cherche à recuperer un numero contenu dans une chaine de caractere, exemple :

    nom5.domaine.com, je soutaite obtenir : 5
    bob12.domaine.com, je soutaite obtenir : 12

    oui, ma chaine ne contiendra qu'un seul entier
    elle commencera toujours par 3 lettres
    xxx{numero}.xxxxx.xxx
    strtol(), strtoul()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
    char const *sa = "nom5.domaine.com";
    char const *sb = "bob12.domaine.com";
     
       printf ("na = %ld\n", strtol(sa + 3, NULL, 10));
       printf ("nb = %ld\n", strtol(sb + 3, NULL, 10));
       return 0;
    }
    Evidemment, on peut faire plus compliqué...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    na = 5
    nb = 12
    Press ENTER to continue.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mnaulet
    tu peux parcourir chaque caractère de ta chaine et déterminer si c'est un nombre avec isdigit() .
    Après si les deux indices de deux nombres se suivent tu crée la chaine correspondante et ainsi de suite
    au secours !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par millie
    Ca fonctionne très bien chez moi avec atoi.
    Oui, mais les fonctions ato*() sont dépréciées depuis 1989 au profit des fonctions strto*(). Elles ne doivent pas être utilisées dans de nouveaux développements.

  20. #20
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais les fonctions ato*() sont dépréciées deluis 1989 au profit des fonctions strto*(). Elles ne doivent pas être utilisées dans de nouveaux développements.

    C'était écrit dans un bouquin de fonctions, mais il doit dater !

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

Discussions similaires

  1. recuperer n caractere dans un string
    Par tongo dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/10/2008, 18h04
  2. [Debutant]compter un char dans un string
    Par Lafab dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2008, 14h33
  3. [Debutant] Manipuler les int dans un string
    Par mr_samurai dans le forum Débuter
    Réponses: 5
    Dernier message: 18/01/2008, 20h00
  4. Comment récupérer un chiffre dans une chaîne ?
    Par kenny49 dans le forum Langage
    Réponses: 1
    Dernier message: 16/08/2006, 14h52
  5. [DEBUTANT]Recherche mot contenu dans une String
    Par lynxman dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 11h49

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