crocejf2000
Messages postés260Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention27 août 2008
-
18 févr. 2003 à 16:35
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDernière intervention 7 mars 2003
-
19 févr. 2003 à 17:32
(Re)Salut
Il faut que je test ma chaine et que je la convertisse si je peut. Avec atoi("12"), ca me donne bien 12, mais si je fait un atoi("12hach"), ca me donne encor 12 alors c'est pas bon.
J'ai vu qu'il y a 'errno' qui est egal a ERANGE si la convertion s'est mal passé mais ca ne fonctionne pas.
Il faudrai que je test ma chaine avant avec une fonction du style isInteger("12hach") ou un truc dans ce genre la mais j'en connais pas. J'ai pas envie non plus de me tapper un
for(int i=0;i<strlen(chaine);i++)
{
if chaine[i]!=...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 18 févr. 2003 à 18:57
Salut,
je te comprends que soit pas terrible avec la boucle que tu proposes pour verifier.
int EstNum(char *psz)
{
while(*psz) {
if((*psz < 48) || (*psz > 57)) return 0;
psz++;
}
return 1;
}
ciao...
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDernière intervention 7 mars 2003 19 févr. 2003 à 02:45
> > Il faut que je test ma chaine et que je la convertisse si je peut. Avec atoi("12"), ca me donne bien 12, mais si je fait un atoi("12hach"), ca me donne encor 12 alors c'est pas bon.
C'est un comportement indéfini. Le standard ne garanti pas le fonctionnement de atoi() si la chaine n'est pas convertible entièrement. Préférer strtol().
> > J'ai vu qu'il y a 'errno' qui est egal a ERANGE si la convertion s'est mal passé mais ca ne fonctionne pas.
Les ato*() n'ont pas d'error-checking et ne font rien de défini si une erreur arrive. strtol() (et strtod() aussi), quand à elle, met la variable errno (de <errno>) à ERANGE :
> > Il faudrai que je test ma chaine avant avec une fonction du style isInteger("12hach") ou un truc dans ce genre la mais j'en connais pas. J'ai pas envie non plus de me tapper un
> > for(int i=0;i<strlen(chaine);i++)
> > {
> > if chaine[i]!=...
> >
C'est l'autre solution, pas très efficace, mais bon...
> Salut,
> je te comprends que soit pas terrible avec la boucle que tu
>proposes pour verifier.
> int EstNum(char *psz)
> {
> while(*psz) {
> if((*psz < 48) || (*psz > 57)) return 0;
À éviter! Ce code n'est pas portable. Préférer les fonctions isdigit() et isalpha() (de <cctype>).
crocejf2000
Messages postés260Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention27 août 20081 19 févr. 2003 à 08:57
Salut,
Tout d'abord, merci pour vos réponses, mais celle de jonathan ne fonctionne pas, alors je vais me rabatre sur celle de BruNews qui me semble facile et rapide a mettre en oeuvre.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 févr. 2003 à 10:26
A mon avis la portabilite a ses limites en langage bas niveau(C/C++ et ASM) et ne doit pas etre la preoccupation 1ere. On est la pour la performance. Si c'est pour faire du logiciel tout terrain et qui tourne aussi lent qu'une jeep, il y a Java. Les fiches cartonnees c'est bien aussi. Et puis etre portable sur 95% du marche mondial devrait suffire.
ciao...
Vous n’avez pas trouvé la réponse que vous recherchez ?
> A mon avis la portabilite a ses limites en langage bas
>niveau(C/C++ et ASM)
Faux, le C++ standard est... standard et portable.
>et ne doit pas etre la preoccupation 1ere.
Dépendemment des circonstances. Si tu programmes un jeu d'autos de course dans ton sous-sol avec dx9, effectivement. Mais si tu programmes un ensemble de classes génériques pour la gestion d'un simulateur de vol qui sera utilisé sous une dizaine d'os différents (de Unix à un vrai simulateur) , la portabilité du code est la préoccupation première. <conio.h> serait à éviter..
>On est la pour la performance. Si c'est pour faire du logiciel
>tout terrain et qui tourne aussi lent qu'une jeep, il y a Java.
Qu'est-ce que tu veux dire?
>Les fiches cartonnees c'est bien aussi.
Et bien moins compliqué :)
>Et puis etre portable sur 95% du marche mondial devrait
>suffire.
Et voilà que tu sors des chiffres de ton chapeau...
Concernant mon programme, honte à moi, je ne l'avais pas testé. Après avoir fait quelques recherches, j'ai lu que le standard n'est pas précis sur le comportement de strtol :
"If no conversion could be performed, strtol() and strtoll()
return 0 and errno may be set to EINVAL."
^^^^
errno *PEUT* être mis à EINVAL (cette valeur change de site en site, des fois ERANGE, des fois -1...), mais ce n'Est pas garanti.
La solution serait donc la boucle qui teste chaque caractère avec isdigit() ou isalpha().