Et le 'truk_correct', c'est quoi ? Tu ne peux pas donner tous les élémenrs d'un coup ? C'est fatiguant à la longue...Envoyé par molesqualeux
Et le 'truk_correct', c'est quoi ? Tu ne peux pas donner tous les élémenrs d'un coup ? C'est fatiguant à la longue...Envoyé par molesqualeux
je resimplifie le problème .
j'ai un flottant que je convertis en chaine de cacactère
puis je veux la remettre en flottant
(imposé par mes structures)
la 1° etape je n'ai pas de problème mais la 2° coince.
imaginon une chaine de caractère
et je voudrais la passer en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char *chaine_num; float nombre; chaine_num = "200.00";
nombre = 200.00
Je ne pense pas que ce soit possible caractère par caractère?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int est_nombre(char *m) { int i = 0; int n = 1; while (m[i] != '\0') { if ((m[i] < '0' || m[i] > '9') && (m[i] != '.')) n = 0; i++; } return n; }
Qu'est-ce qui ne va pas avec sscanf() ou strtod() ?Envoyé par molesqualeux
j'aimerais tester avant de le faire sinon il va me mettre un segmentation fault?
car je suis pas sur .
en fait j'ai une structure qui a un membre numérique flottant un autre membre une chaine et un autre un type.
//structure table des symboles
et pour insérer une nouvelle valeur je me trouve avec une chaine ,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef struct symbole { char *nom_var; char *val_ch; float val_num; int type; symbole lien; }Symbole;
si ca correspont a un "flottant" alors je la met dans la case val_num , sinon je la met dans val_ch.
Ecrit un petit code de test. Il n'y a pas 36 façons de procéder..Envoyé par molesqualeux
Commence déjà par apprendre à utiliser les fonctions citées de manière simple. Ensuite, l'integration dans ton application sera un jeu d'enfant. Il faut aborder les difficultés une par une.en fait j'ai une structure qui a un membre numérique flottant un autre membre une chaine et un autre un type.
je suis d'accord mais ma dernière fonction doit etre presque correcte
si j'ai un caractere qui est un .
c'est à dire .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *m; m = "1000.000";
si je fais afficher m[i] pour i allant de 1 à la fin du mot
il m'affichera
1
0
0
0
.
0
0
En appelant est_nombre il doit me retourner 1 mais il me retourne 0 le probleme vient du .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int est_nombre(char *m) { int i = 0; int n = 1; while (m[i] != '\0') { if ((m[i] < '0' || m[i] > '9') && (m[i] != '.')) n = 0; i++; } return n; }
m[i] != '.' est le bon test??? merci
Plus simple. Tu apprends à utiliser correctement strtol() ou strtod(), notamment le 2 ème paramètre.Envoyé par molesqualeux
Sinon, il faut être précis. Tu veux tester si un nombre est entier ? Il suffit que les caractères soient dans l'ensemble "-0123456789". Pas besoin de faire un cas particulier pour '.'...
voir strchr().
On peut être plus précis sur la position du '-', mais ça fait déjà le ménage.
j'ai pas forcement besoin d'utiliser la conversion chaine -> nombre .
Je vais relire la fonction
/*
Il est également possible d'utiliser la fonction strtol() :
char buf[32]="15";
long n;
char* end;
n=strtol(buf, &end, 10);
suite à l'exécution de la fonction, end contient l'adresse où la conversion s'est arrêtée. Le troisième paramètre de strtol() correspond à la base utilisée (décimale dans l'exemple)
*/
Donc je fais un
end == strlen(buf) --> et doit renvoyer 1?
Ca m'étonnerait ! Mais de toutes façons, tu n'es pas obligé d'utiliser le résultat...Envoyé par molesqualeux
Tu compares une adresse et une longueur ? Jamais tu réflechis avant d'écrire ?Envoyé par molesqualeux
Non il suffit de tester ce qu'ily a en *end. Si c'est pas 0, c'est que le format n'est pas correct.
humhum ca n'a pas l'air de marcher
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 float nombre; char *o = "1000.0"; char *end; nombre=strtol(o, &end, 10); printf("%d",*end); --> m''affiche 46 (qui correspond au code Ascii du point
strtol() permet de convertir une chaine de caractere en long (type entier), ce n'est donc pas cette fonction qu'il faut utiliser mais l'equivalent pour les types reels : strtod().Envoyé par molesqualeux
strtol() et strtoul() c'est pour les entiers. Pour les flottants c'est strtod(). On l'a pas déjà dit 14.000 fois ?Envoyé par molesqualeux
Ben oui :
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%d",*end); --> m''affiche 46 (qui correspond au code Ascii du point
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%c\n",*end);
Partager