J'aimerais tester le type d'une chaine .
"12" -> nombre
"rrrr" -> chaine
Comment faire?
Version imprimable
J'aimerais tester le type d'une chaine .
"12" -> nombre
"rrrr" -> chaine
Comment faire?
Moi, j'essaierais avec strtol() et je regarderais si la lecture s'est arrêté au début ou à la fin de la chaîne...
Tu peux toujours regarder le code ascii en parcourant ta chaine ...
Tu te fais une fonction style is_num qui te renvoi 0 ou 1 si la chaine ne possède que des nombres par exemple.
Cela dépend s'il considèreCitation:
Envoyé par Médinoc
Comme le début d'un nombre ou non... Quoique si, endptr serait égale à NULL, alors on saurait que toute la chaîne a été lue...Code:
1
2 const char *s = "1234Hello";
Jc
Tu veux dire si *endptr == 0 ?Citation:
Envoyé par fearyourself
Ca marche si la chaine a été 'nettoyée' (pas de '\n', par exemple)
ma chaine de caractère est définie de la manière suivante
char *chaine
est ce un problème?
Ca, c'est un pointeur, pas une chaine. Mais on peut espérer qu'il contienne l'adresse d'une chaine valide... si tu as fait ce qu'il fallait...Citation:
Envoyé par molesqualeux
Si tout est correct, non, ce n'est pas un problème.
Comment exploiter ce pointeur sur chaine?
chaine[1] marchera pas?
merci
je pense que le compilateur ne fait pas la diff entre les chiffres et les lettres lorsque lui mets qqc entre " " il la considere comme une chaine de caracteres, ainsi "45455" est une chaine de caracteres composées des symboles 4 et 5 et 4 et 5 et 5
voilà
Ben si, car en C, *(chaine +1) est équivallent à chaine[1].Citation:
Envoyé par molesqualeux
Que signifie *(tab+3) ?Citation:
Envoyé par Emmanuel Delahaye
et maintenant
je voudrais nombre = 5 comment faire?Code:
1
2
3
4 char *chaine; float nombre; chaine = "5";
merci
Ouvre un livre de C. Il y a des fonctions de conversion standard. On ne va pas répondre à des questions aussi basiques...Citation:
Envoyé par molesqualeux
Comment convertir un chaîne de caractère en nombre ?
La :faq: c'est pratique quand même !!!
Marco85
"atoi " chercher
:wink:
Obsolète. Et pour du 'float', ça va pas le faire...Citation:
Envoyé par emardjean
en fait je l'ai lu la page avant ,
mon problème c'est que buf est un tableau de chaine de caractères alors que moi j'ai
un pointeur sur chaine de caractères
Si une chaîne de caractères contient un nombre, il est possible de placer ce nombre dans une variable grâce à la fonction sscanf() (ANSI-C). Sa syntaxe est très similaire à celle de sprintf().
Notamment, les %d, %s… ont la même signification que pour sprintf().
Pour récupérer un nombre n d'une chaîne de caractères on procédera ainsi :
Code:
1
2
3
4
5
6 #include <stdio.h> char buf[32] = "15"; int f; sscanf(buf, "%f", &n);
mais mon problème est plus complexe
or le resultat est correct mais on dirait que c'est un problème de type.Code:
1
2
3
4
5
6
7 char *chaine; chaine = evaluation(p->exp1,4); printf("\n == %s\n",chaine); --> renvoie un truk correct sscanf(chaine, "%f", &valeur_num); printf("\n=== %f",valeur_num); -->renvoie un truc faux
pourtant
alors queCode:char * evaluation(expression exp,int type)
Code:
1
2
3
4
5 char *chaine; chaine = "10" printf("\n == %s\n",chaine); --> renvoie un truk correct sscanf(chaine, "%f", &valeur_num); printf("\n=== %f",valeur_num); -->renvoie un truc correct
Du moment que tu passes une adresse, peu importe...Citation:
Envoyé par molesqualeux
Quel est le type de valeur_num ? Poste du code complet, sinon, on ne peut pas donner de réponse précise.Citation:
Envoyé par molesqualeux
valeur_num est un float.
Et le 'truk_correct', c'est quoi ? Tu ne peux pas donner tous les élémenrs d'un coup ? C'est fatiguant à la longue...Citation:
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 enCode:
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:
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() ?Citation:
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:
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..Citation:
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.Citation:
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:
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:
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.Citation:
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...Citation:
Envoyé par molesqualeux
Tu compares une adresse et une longueur ? Jamais tu réflechis avant d'écrire ?Citation:
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:
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().Citation:
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 ?Citation:
Envoyé par molesqualeux
Ben oui :Citation:
Code:printf("%d",*end); --> m''affiche 46 (qui correspond au code Ascii du point
Code:printf("%c\n",*end);