Conversion chaîne de caractères en double
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Conversion chaîne de caractères en double



  1. #1
    Shadowlugia

    Conversion chaîne de caractères en double


    ------

    Bonjour,

    Je suis en train d’écrire un programme au cours duquel je dois transformer une chaîne de caractère en un « double ». De manière plus précise, cette chaîne est issue d’un fichier .txt dont je donne un extrait ci-dessous.
    Nom : document.jpg
Affichages : 591
Taille : 120,4 Ko
    Le but est d’obtenir, pour chaque excited state (il y en a 12 au total), les valeurs de l’énergie E en eV et la valeur de f, sous forme de « double ». J’ai récupéré l’énergie sous forme de double grâce à la fonction sscanf, mais celle de f, que j’ai séparé à chaque fois du f=, reste sous forme de chaîne de caractères. Je souhaiterais l’obtenir sous forme de double mais je ne sais pas comment opérer la conversion.

    Le code est donné ci-dessous.
    Code:
    #include <stdio.h>                                  
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    double produit_spectre(void) 
    {
     FILE *spectre_th;
    
     
     int i,j;
     double E=0,f=0;  
     char line3[200];
     char chaine1[200],chaine2[200],chainef[200][200];
     char chainefnew[200][200];
     
     // ouverture du fichier	 
     spectre_th=fopen(SPECTRE_TH,"r");
      
     // vÈrification de la bonne ouverture du fichier
     if(spectre_th!=NULL) printf("Fichier spectre theorique trouve\n");
     else {printf("Fichier spectre theorique non trouve\n");
     return 0;}
      
     while (fgets(line3,200,spectre_th)!=NULL) // on lit chaque ligne du fichier
     		{
     		 sscanf(line3,"%s %s",chaine1,chaine2); // on lit les 2 premieres chaines de caracteres
      		 if(strcmp(chaine1,"Excited")==0 && strcmp(chaine2,"State")==0) // si la chaine commence par "Excited State"...
    		    {
    		     /*...on fait imprimer les valeurs de E... */
    		     sscanf(line3,"%*s %*s %*s %*s %lf %*s %*lf %*s %s",&E,chainef); 
    		     printf("\nE=%f",E);
    		     
    		     /*...et celle de f en séparant la valeur du f= */
    		     for(i=0;i<12;i++)
    		     	 {
    		     	  strncpy(&chainefnew[i][0],&chainef[i][2],6);
    		     	 }
    		     printf("\tf=%s\n",chainefnew);
    
    }
    }
    Ainsi, lorsque je demande l'impression des valeurs de f, je suis obligé de le demander sous forme de chaîne (la chaîne chainefnew). Comment dois-je procéder pour obtenir un double ?

    Merci de votre aide

    -----
    Dernière modification par Jack ; 22/10/2012 à 08h15. Motif: Ajout des balises code

  2. #2
    invited1c1a33e

    Re : Conversion chaîne de caractères en double

    Bonjour,

    Il semble que vous avez un problème d'indice puisque vous scannez chainef et ensuite vous copiez chainef[i]

    Pour votre question vous pouvez utiliser sscanf, atod ou un algorithme de Horner, en utilisant chainef[i]

    Code:
      char *s = "f=0.78655";
      double d ;
        sscanf(s, "%*c%*c%lf", &d) ;
        printf("d=%lf\n", d) ;

  3. #3
    freepicbasic

    Re : Conversion chaîne de caractères en double

    function
    atof
    <cstdlib>

    double atof ( const char * str );

    Convert string to double


    http://www.cplusplus.com/reference/c.../cstdlib/atof/
    A+, pat

  4. #4
    invited1c1a33e

    Re : Conversion chaîne de caractères en double

    oui atof ou strtod j'ai buggé^^

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Conversion chaîne de caractères en double

    Première remarque: conformément aux règles décrites en tête de ce forum algo programmation, il faut
    1) indiquer le langage, le compilateur, etc
    2) indenter correctement le programme source et utiliser les balises code pour que cette indentation soit respectée à l'affichage.

    Pour ton problème:
    Code:
    for(i=0;i<12;i++)
    {
    strncpy(&chainefnew[i][0],&chainef[i][2],6);
    }
    Pourquoi utiliser un tableau de chaines? Une chaîne ne suffit-elle pas?

    Pourquoi reboucler 12 fois?
    de plus le strncpy ne doit pas être limité à 6 caractères. Dans ton cas, tu as loupé le 0 qui termine une chaine.

    Finalement, tu peux continuer à utiliser le sscanf, en "sautant" les 2 1er caractères (f=) de chainef. Ce qui donne:
    Code:
        sscanf(line3,"%*s %*s %*s %*s %lf %*s %*lf %*s %s",&E,chainef);
        printf("\nE=%f",E);
        sscanf(chainef+2,"%lf",&f);
    A+

    PS: je n'avais pas vu ta solution zartan, j'étais en train d'éditer. Voilà donc plusieurs solutions pour résoudre ce problème
    Dernière modification par Jack ; 22/10/2012 à 09h05.

  7. #6
    invited1c1a33e

    Re : Conversion chaîne de caractères en double

    On peut même tout faire en une seule ligne, je n'ai pas tout corrigé mais ça ressemble à ça :

    Code:
    double produit_spectre(void) 
    {
      FILE *spectre_th;
    
     
      int i,j;
      int ind = 0;
      double E=0;
      double f[200];  
      char line3[200];
      char chaine1[200],chaine2[200],chainef[200][200];
      char chainefnew[200][200];
     
      // ouverture du fichier 
      spectre_th=fopen(SPECTRE_TH,"r");
      
      // vÈrification de la bonne ouverture du fichier
      if(spectre_th!=NULL) printf("Fichier spectre theorique trouve\n");
      else {printf("Fichier spectre theorique non trouve\n");
        return 0;}
      
      while (fgets(line3,200,spectre_th)!=NULL) // on lit chaque ligne du fichier
        {
          sscanf(line3,"%s %s",chaine1,chaine2); // on lit les 2 premieres chaines de caracteres
          if(strcmp(chaine1,"Excited")==0 && strcmp(chaine2,"State")==0) // si la chaine commence par "Excited State"...
    	{
    	  /*...on fait imprimer les valeurs de E... */
    	  sscanf(line3,"%*s %*s %*s %*s %lf %*s %*lf %*s %*c%*c%lf",&E,&f[ind]); 
    	  printf("\nE=%lf, f[%d]=%lf",E, ind, f[ind]);
    	  ind++;
    	       
    	}
        }
    }
    Il faudrait enlever les variables inutiles et probablement passer E en tableau.

  8. #7
    Jack
    Modérateur

    Re : Conversion chaîne de caractères en double

    C'est encore plus simple en effet.

    A+

  9. #8
    Shadowlugia

    Re : Conversion chaîne de caractères en double

    Merci à tous pour vos réponses,

    J'ai effectivement corrigé le problème avec les indices et utilisé la fonction atof, cela a permis de résoudre mon problème. il y a en effet sans doute des variables inutiles dan mon programme (je suis encore peu familier du C), j'essaierai de l'alléger.

Discussions similaires

  1. C18 et chaine de caracteres.
    Par invite6cb06424 dans le forum Électronique
    Réponses: 11
    Dernier message: 08/10/2015, 12h03
  2. Transformation d'une chaine de caractères
    Par anthony_unac dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 11/10/2011, 17h35
  3. Réponses: 1
    Dernier message: 10/08/2010, 17h26
  4. Chaine de caractères en C
    Par invite953f8104 dans le forum Électronique
    Réponses: 8
    Dernier message: 03/03/2009, 20h28
  5. PIC : Chaine de caractères
    Par Toufinet dans le forum Électronique
    Réponses: 2
    Dernier message: 24/05/2006, 17h49