cs_noumian
Messages postés49Date d'inscriptionsamedi 2 avril 2005StatutMembreDernière intervention 3 décembre 2008
-
4 mai 2007 à 22:40
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
6 mai 2007 à 16:43
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){
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 4 mai 2007 à 23:01
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(....).
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 4 mai 2007 à 23:59
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);
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 5 mai 2007 à 16:11
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
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 5 mai 2007 à 18:04
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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 5 mai 2007 à 19:03
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
ouif(*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 chaineelse 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.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 5 mai 2007 à 21:54
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 ;-)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 5 mai 2007 à 22:25
"Le code unsafe est à bannir"
Dépend du point de vue. Quand l'on est seul maitre de ce qui se passe dans le programme (donc pas d'intervention de l'utilisateur), aucune raison de sécurité (par exemple, test de validité d'un pointeur). Mais sitôt que l'utilisateur entre en jeux, là faut tout prévoir. Quoi qu'il en soit, j'ai donné une version corrigé. Plus aucune raisons de bannir mon code: