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 :

spliter une chaine de caractère


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut spliter une chaine de caractère
    Bonjour à tous,

    moi qui suis habituée au perl, je suis confrontée au manque de petite fonction pratique du C pour le traitement des chaînes de caractères (à moins que je ne les connaissent pas...).
    Je vous explique brièvement mon problème. Je vous prie à l'avance de bien vouloir m'excuser si je n'emploie pas les bon termes)
    Je possède une chaine de caractère: char ligne [1000] et cette ligne est de la forme: "0.1\t0.7\t1.6\t-0.8\t......\t0.8\n" et j'aimerai transformer cette chaine en un tableau de double ou chaque case contiendrai un élément.

    J'ai essayé pas mal de chose avec strtok, mais je n'y arrive pas.
    Je vous mets mon code pour essayer d'etre plus clair:

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main (int argc, char *argv[]){
         int taille=atoi(argv[1]),j; 
         char ligne[10000];
         double *A = malloc(taille*sizeof(double));
         FILE *file;
     
         if ((file = fopen(argv[2],"r"))==NULL){
    		fprintf(stderr,"impossible d'ouvrir le fichier en lecture\n");
         }
         while (fgets(ligne,10000,file)!=NULL){
    		for(j=0;j<taille;j++){
    			char * gene1 = strtok(ligne,"\t");
    			printf("%s\n",gene1);  //affiche tjs le premier element
    			A[j] = atof(gene1);
    		}
    	}
    return 0;
    }
    quand je compile, il n'y a pas de problème, par contre quand je l'execute A ne contient que des 0.00000 et si j'affiche a chaque tour de boucle gene1 j'ai toujours le premier element de ma ligne, alors que je m'attendrai au moins a voir le premier element...

    Si quelqu'un peut m'aider
    Si vous avez des remarque sur des améliorations de mon code, n'ésiter pas, je suis ici pour essayer de m'améliorer

    merci

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    J'ai essayé pas mal de chose avec strtok, mais je n'y arrive pas.
    Utiliser strtok() est une bonne solution mais son utilisation n'est pas correcte:
    man developpez strtok()

    Il est dit:
    Le premier appel à strtok() doit fournir s comme premier argument. Les appels ultérieurs doivent fournir NULL comme premier argument. Chaque appel renvoie un pointeur sur l'élément lexical suivant, ou NULL quand il n'y en a plus.
    D'autre part, atoi(), atof() etc... sont des fonctions obsolètes, il est préférable d'utiliser les fonctions strtoul(), strtod() etc...

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    strtok s'utilise en boucle si tu veux splitter une chaîne. Voici un exemple.

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par homeostasie
    D'autre part, atoi(), atof() etc... sont des fonctions obsolètes
    Je ne dirais pas de ces fonctions qu'elles soient obsolètes. Elles sont utiles dans certaines circonstances (pour tuer une mouche par exemple ...).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut merci :)
    super!
    merci à vous 2, ca marche parfaitement maintenant

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Alors finallement, j'étais contente... mais j'ai encore un problème.

    En fait, dans ma chaine de caractère que je veut découper, il y a les 2 premières colonnes qui ne sont pas des chiffres et que je ne veux donc pas stocker dans mon tableau. Je pensais faire un code tout bete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while (fgets(ligne,10000,file)!=NULL){
    		j=0;
    		gene1=strtok(ligne,"\t");
    		gene1=strtok(NULL,"\t");
    		while(gene1 != NULL){
    			gene1 = strtok(NULL,"\t");
    			A[j] = atof(gene1);	
    			j=j+1;
    		}
    	}
     
    	for(k=0;k<taille;k++){printf("%f\n",A[k]);}
    Je pensais que j'allais ainsi écraser 3 fois le contenu de gene1 et stocker a partir de la 3eme fois dans mon tableau A.
    Pourtant, quand je fais ma boucle pour afficher le contenu de A, je n'ai que des 0.000

    Vous voyez pourquoi?
    merci

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,

    Peuts-tu poster le fichier que tu passes en argument ?

    Apparemment atof aurais tendance à provoquer une erreur de segmentation si on lui passe un pointeur NULL, chose qui arrive avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (fgets(ligne,10000,file)!=NULL){
    		j=0;
    		gene1=strtok(ligne,"\t");
    		gene1=strtok(NULL,"\t");
    		while(gene1 != NULL){
    			gene1 = strtok(NULL,"\t");
    			A[j] = atof(gene1);	
    			j=j+1;
    		}
    	}
     
    	for(k=0;k<taille;k++){printf("%f\n",A[k]);}
    'gene1' peut très bien être NULL, ceci réglera le soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (fgets(ligne,10000,file)!=NULL){
    		j=0;
    		gene1=strtok(ligne,"\t");
    		gene1=strtok(NULL,"\t");
    		while((gene1 = strtok(NULL,"\t"))!=NULL ){
    			A[j] = atof(gene1);	
    			j=j+1;
    		}
    	}
     
    	for(k=0;k<taille;k++){printf("%f\n",A[k]);}
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Réponses: 4
    Dernier message: 01/05/2008, 18h15
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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