Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1275 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème avec sscanf

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec sscanf

n°1240287
Sissi80
Posté le 07-11-2005 à 12:21:59  profilanswer
 

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 !
 

mood
Publicité
Posté le 07-11-2005 à 12:21:59  profilanswer
 

n°1240995
scol30
Posté le 08-11-2005 à 08:12:25  profilanswer
 

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 !


n°1241113
blackgodde​ss
vive le troll !
Posté le 08-11-2005 à 11:58:50  profilanswer
 

std::cin >> ?


---------------
-( BlackGoddess )-
n°1241146
hoty
Posté le 08-11-2005 à 13:05:22  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème avec sscanf

 

Sujets relatifs
Probleme Access: assistant création formulaire ne détecte pas de champProbleme de répertoire
probleme entre script et GIF animesproblème de migration sur 1and1
probleme programmationPetit problème avec mon design css
Probleme css avec mozilla[PHP XML] problème de conversion UTF-16 -> ISO-8859-1
probleme avec sscanf ...problème sur un sscanf non encore rencontrée !
Plus de sujets relatifs à : Problème avec sscanf


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR