begin process at 2012 05 28 23:04:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 18 février 2003 à 16:35:56 | Convertion "15"(string) --> 15(int)

crocejf2000

(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
mardi 18 février 2003 à 18:57:55 | Re : Convertion "15"(string) --> 15(int)

BruNews

Administrateur CodeS-SourceS
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...

-------------------------------
Réponse au message :
-------------------------------

> (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
mercredi 19 février 2003 à 02:45:26 | Re : Convertion "15"(string) --> 15(int)

jonathanmcdougall

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

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

mercredi 19 février 2003 à 08:57:31 | Re : Convertion "15"(string) --> 15(int)

crocejf2000

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


-------------------------------
Réponse au message :
-------------------------------

> > > 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 <iostream>
>
> 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
>
>
mercredi 19 février 2003 à 10:26:17 | Re : Convertion "15"(string) --> 15(int)

BruNews

Administrateur CodeS-SourceS
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...

-------------------------------
Réponse au message :
-------------------------------

> 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
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > > > 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 <iostream>
> >
> > 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
> >
> >
>
mercredi 19 février 2003 à 17:32:43 | Re : Convertion "15"(string) --> 15(int)

jonathanmcdougall

> > > # include <errno>
> > > # include <iostream>
> > >
> > > 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,

--
Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware



Cette discussion est classée dans : int, string, chaine, test, convertion


Répondre à ce message

Sujets en rapport avec ce message

Convertion d'une string en char [ par redpooka ] Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iostre help :: String => Int [ par Skyman ] Comment on fait pour changer un string en int ou en long ?ex :char *chaine;int entier;long entierlong;chaine = "1234";int = chaine; // (int = 1234) Problème écriture fichier avec fputs et chaine créée avec l'objet string [ par curite ] Bonjours, j'ai un problème, je n'arrive pas a écrire dans un fichier avec fputs en mettant un chaine de caractère créée avec l'objet string, voici le methodes paramètres par défaut [ par simonpelloquin ] Bonjour, Existe-il la possibilité de donner des valeurs par défaut à des paramètres de fonction ou méthodes ? (comme en pascal avec =nil) Je m'expliq Gestion de plusieurs ports RS232 [ par dissezfr ] Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina Recréer la fonction strstr [ par qubs ] Salut, J'aimerais recoder la fonction strstr mais je n'arrive pas a aboutir et a comprendre le fonctionnement, j'aimerais bien un coup de main svp. = fonction inverse c++ [ par bretdu55 ] Bonjour, J'ai plusieurs exos en c++ à faire et le problème est que je n'arrive pas à faire une fonction inverse pour inverser l'affichage d'un mot. ajout d'un element à la fin d'une liste chainée [ par beatkof ] bonsoir je voudrai faire une fonction qui ajout un element à la fion d'une liste chainée et je n'y arrive pas voila ma fonction: #include #include s Mince ! Mon flux fstream fonctionne très mal [ par Davy974 ] Bonjour à tour, mon code ne fonctionne pas très bien ! Sauriez vous dire pourquoi ! ------------fstream.h----------------------- #ifndef CORE_FSTREA


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,312 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales