begin process at 2012 05 29 04:41:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

float from sting


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

float from sting

vendredi 4 mai 2007 à 22:40:34 | float from sting

noumian


bonjout a tous
j'ai un petit prebleme avec une fonction de mon programme
jvoudrais extraire un chiffre (float) inserer entre deux string "hello" et "world!" .le tout dans une string , par la fonction ci dessus:

float ExtractFloat(const char *str){

strcat("hello",str);

strcat("Word!",str);

return str;

 }


par exemple si je fait : c = ExtractFloat("Hello 1.124 World!");

'c' doit etre egale a 1.124

mais ca ne fonctionne pas aidez moi!!!

ouais man

vendredi 4 mai 2007 à 23:01:55 | Re : float from sting

DeAtHCrAsH

strcat ca sert a concatener non pas a extraire une chaine....
Parcours ta chaine octet par octet, puis dès que tu detecte le premier chiffre tu bufferise dans une variable temporaire.
Tu t'arretes une fois un caractère trouvé.
Ensuite pour convertir de char[] à float tu utilises atof(....).

Shell
vendredi 4 mai 2007 à 23:03:26 | Re : float from sting

BruNews

Administrateur CodeS-SourceS
atof() direct, aucun besoin de recopier.

ciao...
BruNews, MVP VC++
vendredi 4 mai 2007 à 23:04:44 | Re : float from sting

emmatopiak

Salut,

Le premier appel doit être un strcpy et ensuite un strcat pas deux strcat.
Et puis c'est worLd pas word ( oublie pas l'espace )

@++
vendredi 4 mai 2007 à 23:59:46 | Re : float from sting

racpp

Administrateur CodeS-SourceS
Salut,
Voici un petit exemple de fonction que tu peux améliorer:
float ExtractFloat(char* str)
{
    char chiffre=0;
    int index =0;
    do
    {
        chiffre=*(str
+index);
        if(!chiffre) return 0; // = fin de la chaine
        index++;
    }while(!isdigit(chiffre));
    index--;
    return atof(str
+index);
}

samedi 5 mai 2007 à 16:11:16 | Re : float from sting

DeAtHCrAsH

Voila un code identique a celui de racpp mais en plus performant et plus blindé.
- Controle de la validité du pointeur
- Gestion des rééls négatif
- Seule appel de atof (pas d'autre tel isdigit)
- Boucle while a la place de do..while pour éviter la décrémentation en fin de boucle
- Pas d'utilisation de variable char.

Voici le code :

float ExtractFloat(char * pszStr)
{
   int i = 0;

   if(!pszStr) return 0; // Test de la validité du pointeur
   while(!pszStr[i] && pszStr[i] < 47 || pszStr[i] > 58) i++; // Determine la position du premier digit

   if(i > 0 && pszStr[i-1] == 45) i--; // Gestion des rééls négatif   

   
return atof(pszStr + i); // retourne le resultat après conversion en float
}


Shell
samedi 5 mai 2007 à 16:45:30 | Re : float from sting

SAKingdom

Membre Club
float ExtractFloat (char *str)
{
    char *c = str;
    if(!c) return 0;
    while(*c && (*c < '0' || *c > '9')) ++c;
    if(*c && *(c-1) == '-') --c;
    return atof(c);
}

C++ (@++)

samedi 5 mai 2007 à 18:04:42 | Re : float from sting

DeAtHCrAsH

SAKingdom> C'etait bien pensé mais il y a un soucis avec une ligne de ton code ....

Quote : if(*c && *(c-1) == "-") --c;

Si tu as une chaine du genre 1.23Hello alors *(c-1) pointe sur une zone mémoire qui n'est pas tienne donc attention les dégats....
De plus le *c n'a aucun sens ici puisque au début tu vérifie la validité du pointeur qui a ce stade est focement bon meme dans le cas ou tu es en fin de chaine mais a ce moment la le test n'a pas lieu d'etre.





Shell
samedi 5 mai 2007 à 19:03:10 | Re : float from sting

SAKingdom

Membre Club
if(*c
On ne vérifie pas la validité du pointeur mais le contenue. Je test pour savoir si le caractère dans *c est nul. Si oui, inutile de comparer sont précédent car il n'y a plus rien après. On peut cependant s'arranger autrement
Pour le *(c-1) en dehors de la zone, oui c'est vrai, je n'y avait pas pensé mais il serait très étonnant que la valeur à cet endroit soit '-'. D'ailleurs, ça m'étonnerais beaucoup qu'il y ai des dégâts comme tu dit car il ne fait que lire.
Voici un model corrigé:

if(c != str && *(c-1) == '-') --c; // atof s'arrangera si il y a un - en fin de chaine
ou
if(*c && c != str && *(c-1) == '-') --c; // atof s'arrangera si il s'agit du 0 de fin de chaine
ou encore
if(!*c) return 0; // Quitte direct s'il n'y a aucun chiffre dans la chaine
else if(c != str && *(c-1) == '-') --c;

En passent, j'ai beaucoup de difficulté à comprend comment ton code pourrait bien fonctionner:
while(!pszStr[i] && pszStr[i] < 47 || pszStr[i] > 58) i++
Quitte sitôt qu'un caractère est non nul donc direct en début de chaine.

C++ (@++)

samedi 5 mai 2007 à 21:54:30 | Re : float from sting

DeAtHCrAsH

lol reglement de compte ^^
Autant pour moi le signe "!" est de trop et des parenthèses sont manquantes.
Si mon code ne quitte actuellement pas c'est tout simplement à cause (ou grace) au "||".

Voici la correction de cette ligne :
while(pszStr[i] && (pszStr[i] < 47 || pszStr[i] > 58)) i++; // Determine la position du premier digit

Malgré tout ton code reste unsafe. Quand je te parle de dégat c'est surtout dans le sens ou tu ne maitrises pas cet emplacement mémoire et que donc tu n'es sur de rien. Si une personne prend ton algo et s'en sert dans de grosse boucle par exemple, elle risque d'avoir des surprises sans meme savoir pourquoi.
Le code unsafe est à bannir, tu fais du C pas du VB.

Bref ca fait toujours plaisir de partager des avis ;-)

Shell

1 2

Cette discussion est classée dans : str, from, float, hello, sting


Répondre à ce message

Sujets en rapport avec ce message

Pb avec DRAWTEXTW [ par BULBY ] Bonjour, J'essaye de faire un tout petit programme qui affiche une chaine de caractère en japonais (unicode). Avec la fonction TextOutW, pas de problè Conversion d un float [ par Seth ] Comment arrondir un float vers le nombre le plus proche.Exemple : (float)2.8 -> 3 ! (float)2.3 -> 2 [C++] precision [ par kikiops ] comment faire pour avoir des resultats float avec deux decimalesj'vous donne un ch'tit exemple , ca sera plus simple pour m'faire comprendrefloat a = Conversion de donnée [ par Johjo ] Salut tout le monde, je cherche à convertir une valeur char en valeur float et inversement de float en char. L'equivalent de Val et Str en basic.Merci Convertir une chaine de caractere en Float [ par Johjo ] Bon, voilà, j'ai encore un probleme.Je dois maintenant convertir un chaine de caractere en float, et je ne trouve pas de fonctions, j'ai regardé dans dépassement capacité d'un float et int [ par golum ] result=scanf("%f",&coef); if (result !=0 && coef !=0)Voila si j'entre un nombre délirant style 9999999999999999999999999999999999999999999999999999999 Conversion Float to String [ par PierreP ] Bonjour à tous !je suis en train de me prendre la tête pour créer une fonction de conversion d'un réel en une chaine de caractère (problème du débutan arrondir un chiffre [ par JosueClement ] en admettant que j'ai une variable de type float:float var = 6.98466;je voudrais pouvoir arrondir le chiffre. par exemple 6.98 !Merci d'avanceJosué Cl Comment concertir Ansistring en unsigned char*????? [ par asik38 ] Ansistring x;unsigned char str[100];str[100]=x;??????Merci!!! C'est quoi float !!!? [ par ATH|500| ] Je voudrais savoir à quoi sert la commande:floatExemple: float j;


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,279 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales