Convertion "15"(string) --> 15(int)

Signaler
Messages postés
260
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
27 août 2008
-
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003
-
(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]!=...

donc merci pour vos suggestions

Hart

5 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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...
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003

> > 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 :

# include <errno>
# include

using namespace std;

int main()
{
errno = 0; //on claire errno

const char *s = "513";
const char *s2 = "513pasbon";

int maValeur = int(strtol(s, 0, 10));
if (errno == ERANGE)
cout << "Pas bon";
else
cout << "C'est bon";

maValeur = int(strtol(s2, 0, 10));
if (errno == ERANGE)
cout << "Pas bon";
else
cout << "C'est bon";

}

> > 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>).

> psz++;
> }
> return 1;
> }

Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware
Messages postés
260
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
27 août 2008
1
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.

A+
Hart
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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...
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003

> > > # include <errno>
> > > # include
> > >
> > > using namespace std;
> > >
> > > int main()
> > > {
> > > errno = 0; //on claire errno
> > >
> > > const char *s = "513";
> > > const char *s2 = "513pasbon";
> > >
> > > int maValeur = int(strtol(s, 0, 10));
> > > if (errno == ERANGE)
> > > cout << "Pas bon";
> > > else
> > > cout << "C'est bon";
> > >
> > > maValeur = int(strtol(s2, 0, 10));
> > > if (errno == ERANGE)
> > > cout << "Pas bon";
> > > else
> > > cout << "C'est bon";
> > >
> > > }
> > >

> 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().

Bonne journée,