Problème avec sscanf

Problème avec sscanf - C++ - Programmation

Marsh Posté le 07-11-2005 à 12:21:59    

Salut,
J'ai un problème bizarre avec sscanf.
Voila, je dois lire une string contenant 10 mots:
 
---
strNewEntity="texture  Concrete 1e-021 3 1 0 0 1 0.2 15000804";
---
 
Le problème, c'est que certaines de mes strings contiennent 11 mots:
 
---
strNewEntity="texture  Concrete 1e-021 3 1 0 0 NONE 1 0.2 15000804";
---
 
Pour lire ces strings, je voudrais d'abord vérifier si ma string a 11 mots et dans le cas contraire, lire seulement 10 mots. J'ai codé ceci comme ça:
 

Citation :


 char cType[32];
 char cName[256];
 char cDiffusion[8];
 double *pdbConduct = new double;
 double *pdbPermit = new double;
 float *pfReflexion = new float;
 float *pfTransparence = new float;
 float *pfDiffraction = new float;
             int pnSolid=new int;
 double *pdbEpaisseur = new double;
 COLORREF *pcolor = new COLORREF;
 
nNbChamps = sscanf(strNewEntity, "%s %s %lf %lf %f %f %f %c %d %lf %d",  
 cType, cName, pdbConduct, pdbPermit, pfReflexion, pfTransparence,  
 pfDiffraction, cDiffusion, pnSolid, pdbEpaisseur, pcolor);
 
 if(nNbChamps == 11)
 {
      nRet = 0;
 }
 else
 {
      nNbChamps = sscanf(strNewEntity, "%s %s %lf %lf %f %f %f %d %lf %d",  
   cType, cName, pdbConduct, pdbPermit, pfReflexion, pfTransparence,  
   pfDiffraction, pnSolid, pdbEpaisseur, pcolor);


             }
 
Or, si je lis une string avec 10 mots, sscanf me renvoie quand même 11.  
Ses affectations sont plutôt bizarres:
 
*pfDiffraction=1
*pnSolid=0 (<- pourquoi 0 ?)
*pdbEpaisseur=0.2
*pcolor=15000804
 
Merci de me renseigner si vous pouvez !
 

Reply

Marsh Posté le 07-11-2005 à 12:21:59   

Reply

Marsh Posté le 08-11-2005 à 08:12:25    

Il y a un souci aved ce que tu as poste:
 
int pnSolid=new int; <<<< soit c'est un simple int et tu ne fais pas de new et tu passes une ref au sscanf
                              <<<< soit c'est 1 pointeur alors int *pnSolid = new int;
 
Pour ce qui est de trouver le nombre de mots dans la string utilise plutot des std::string ce sera plus simple.
#include <string>
 
  std::string strNewEntity= "texture Concrete 1e-021 3 1 0 0 1 0.2 15000804";
  std::string::iterator myIter = strNewEntity.begin();
  for(;myIter != strNewEntity.end();myIter++)
    if(*myIter == ' ')
      count++;
  count++;
  if(count == 11) {
    nRet = 0;
  } else {
    nNbChamps = sscanf(strNewEntity.c_str(), "%s %s %lf %lf %f %f %f %d %lf %d",  
         cType, cName, pdbConduct, pdbPermit, pfReflexion,
         pfTransparence, pfDiffraction, pnSolid, pdbEpaisseur,
         pcolor);
  }
 

Sissi80 a écrit :

Salut,
J'ai un problème bizarre avec sscanf.
Voila, je dois lire une string contenant 10 mots:
 
---
strNewEntity="texture  Concrete 1e-021 3 1 0 0 1 0.2 15000804";
---
 
Le problème, c'est que certaines de mes strings contiennent 11 mots:
 
---
strNewEntity="texture  Concrete 1e-021 3 1 0 0 NONE 1 0.2 15000804";
---
 
Pour lire ces strings, je voudrais d'abord vérifier si ma string a 11 mots et dans le cas contraire, lire seulement 10 mots. J'ai codé ceci comme ça:
 

Citation :


 char cType[32];
 char cName[256];
 char cDiffusion[8];
 double *pdbConduct = new double;
 double *pdbPermit = new double;
 float *pfReflexion = new float;
 float *pfTransparence = new float;
 float *pfDiffraction = new float;
             int pnSolid=new int;
 double *pdbEpaisseur = new double;
 COLORREF *pcolor = new COLORREF;
 
nNbChamps = sscanf(strNewEntity, "%s %s %lf %lf %f %f %f %c %d %lf %d",  
 cType, cName, pdbConduct, pdbPermit, pfReflexion, pfTransparence,  
 pfDiffraction, cDiffusion, pnSolid, pdbEpaisseur, pcolor);
 
 if(nNbChamps == 11)
 {
      nRet = 0;
 }
 else
 {
      nNbChamps = sscanf(strNewEntity, "%s %s %lf %lf %f %f %f %d %lf %d",  
   cType, cName, pdbConduct, pdbPermit, pfReflexion, pfTransparence,  
   pfDiffraction, pnSolid, pdbEpaisseur, pcolor);


             }
 
Or, si je lis une string avec 10 mots, sscanf me renvoie quand même 11.  
Ses affectations sont plutôt bizarres:
 
*pfDiffraction=1
*pnSolid=0 (<- pourquoi 0 ?)
*pdbEpaisseur=0.2
*pcolor=15000804
 
Merci de me renseigner si vous pouvez !


Reply

Marsh Posté le 08-11-2005 à 11:58:50    

std::cin >> ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 08-11-2005 à 13:05:22    

Bonjour,
 
essaye quelque chose comme ca. J'ai remplace les alloc dynamiques par des variables simples pour
plus de lisibilite.
 

Code :
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <sstream>
  4. using namespace std;
  5. int main(int argc, char* argv[])
  6. {
  7.    char     cType[32];
  8.    char     cName[256];
  9.    char     cDiffusion[8];
  10.    double   dbConduct;
  11.    double   dbPermit;
  12.    float    fReflexion;
  13.    float    fTransparence;
  14.    float    fDiffraction;
  15.    int      nSolid;
  16.    double   dbEpaisseur;
  17.    COLORREF color;
  18.    //const char * strNewEntity="texture  Concrete 1e-021 3 1 0 0 1 0.2 15000804";  
  19.    const char * strNewEntity="texture  Concrete 1e-021 3 1 0 0 NONE 1 0.2 15000804";
  20.    // Essaye d'abord de lire 10 items
  21.    istringstream S1 (strNewEntity);
  22.    S1 >> cType>> cName>> dbConduct>> dbPermit>> fReflexion>> fTransparence>>
  23.          fDiffraction>> nSolid>> dbEpaisseur>> color;
  24.    //
  25.    // si le stream n'est pas vide, reessaye avec 11 items
  26.    if (!S1.eof())
  27.    {
  28.       istringstream S2 (strNewEntity);
  29.       S2 >> cType>> cName>> dbConduct>> dbPermit>> fReflexion>> fTransparence>>
  30.             fDiffraction>> cDiffusion>> nSolid>> dbEpaisseur>> color;
  31.    }
  32.    //
  33.    cout << "type " << cType << " color " << color << endl;
  34.    //
  35.    return 0;
  36. }


---------------
http://www.ikimegon.com/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed