OVH Cloud OVH Cloud

Parsing d'entiers

11 réponses
Avatar
Sylvain Togni
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?

std::istringstream test("1,2,3");
int i;
assert(test >> i);

--
Sylvain Togni

10 réponses

1 2
Avatar
Alexandre
"Sylvain Togni" <"sylvain.togni at visionobjects.com"> a écrit dans le
message de news: 45afba56$0$21145$
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?

std::istringstream test("1,2,3");
int i;
assert(test >> i);

--
chez moi (C++Builder 2006) le code suivant passe, et affiche 1 :

std::istrstream test("1,2,3");
int i;
assert(test>>i);
std::cout<<i;

par contre il ne connait pas istringstream chez moi mais istrstream,
étrange, non ?

Avatar
Sylvain
Sylvain Togni wrote on 18/01/2007 19:20:
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?

std::istringstream test("1,2,3");
int i;
assert(test >> i);


si iss utilise une locale et que celle-ci accepte (requiert) la virgule
comme séparateur décimal (cas de la locale FR par défaut); alors oui
c'est normal.

Sylvain.

Avatar
Jean-Marc Bourguet
Sylvain writes:

Sylvain Togni wrote on 18/01/2007 19:20:
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?
std::istringstream test("1,2,3");
int i;
assert(test >> i);



Je ne vois aucune raison.

si iss utilise une locale et que celle-ci accepte (requiert) la virgule
comme séparateur décimal (cas de la locale FR par défaut); alors oui c'est
normal.


Je ne vois pas pourquoi.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Jean-Marc Bourguet
"Alexandre" writes:

"Sylvain Togni" <"sylvain.togni at visionobjects.com"> a écrit dans le
message de news: 45afba56$0$21145$
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?

std::istringstream test("1,2,3");
int i;
assert(test >> i);

--
chez moi (C++Builder 2006) le code suivant passe, et affiche 1 :

std::istrstream test("1,2,3");
int i;
assert(test>>i);
std::cout<<i;

par contre il ne connait pas istringstream chez moi mais istrstream,
étrange, non ?


istringsteam est declare dans sstream.

istrstream est officiellement obsolete.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Alain Gaillard

istringsteam est declare dans sstream.

istrstream est officiellement obsolete.


C++ Builder 6 aussi. ;-)

--

Alain

Avatar
Alain Gaillard
Le Fri, 19 Jan 2007 08:56:34 +0100, Jean-Marc Bourguet a écrit :

Sylvain writes:

Sylvain Togni wrote on 18/01/2007 19:20:
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?
std::istringstream test("1,2,3");
int i;
assert(test >> i);



Je ne vois aucune raison.

si iss utilise une locale et que celle-ci accepte (requiert) la virgule
comme séparateur décimal (cas de la locale FR par défaut); alors oui c'est
normal.


Je ne vois pas pourquoi.


Je me risque à une réponse de normand, ça peut être normal ou pas ;) La
question est de savoir ce qui est un séparateur ou pas et comme le fait
remarquer Sylvain, ça dépend des locales. Si je comprends bien le
problème cela revient à discuter de l'extracteur dans une chaîne. Le
standard dit ceci:

21.3.7.9 Inserters and extractors [lib.string.io]
template<class charT, class traits, class Allocator>
basic_istream<charT,traits>&
operator>>(basic_istream<charT,traits>& is,
basic_string<charT,traits,Allocator>& str);
Effects: Begins by constructing a sentry object k as if k were constructed by typename
1
basic_istream<charT,traits>::sentry k(is). If bool(k) is true, it calls
str.erase() and then extracts characters from is and appends them to str as if by calling
str.append(1,c). If is.width() is greater than zero, the maximum number n of characters
appended is is.width(); otherwise n is str.max_size(). Characters are extracted and appended until any of the following occurs:
- n characters are stored;
- end-of-file occurs on the input sequence;
- isspace(c,is.getloc()) is true for the next available input character
c.
After the last character (if any) is extracted, is.width(0) is called
and the sentry object k is
2
destroyed.

donc tout dépend de ce que retourne isspace(c,is.getloc());


--

Alain



Avatar
Sylvain Togni
Sylvain wrote:

si iss utilise une locale et que celle-ci accepte (requiert) la virgule
comme séparateur décimal (cas de la locale FR par défaut); alors oui
c'est normal.


Effectivement, le problème viens bien du fait que la virgule
est considérée comme le séparateur des milliers par la locale.

Mais apparemment, c'est bien un bug, cf.
<http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID˜836>

--
Sylvain Togni

Avatar
Jean-Marc Bourguet
Alain Gaillard writes:

Le Fri, 19 Jan 2007 08:56:34 +0100, Jean-Marc Bourguet a écrit :

Sylvain writes:

Sylvain Togni wrote on 18/01/2007 19:20:
Bonjour,
Est-ce que c'est normal que le test suivant échoue (VC++ 2005) ?
std::istringstream test("1,2,3");
int i;
assert(test >> i);



Je ne vois aucune raison.

si iss utilise une locale et que celle-ci accepte (requiert) la virgule
comme séparateur décimal (cas de la locale FR par défaut); alors oui c'est
normal.


Je ne vois pas pourquoi.


Je me risque à une réponse de normand, ça peut être normal ou pas ;) La
[... description de >> pour des std::string...]


Je ne vois pas en quoi le comportement pour >> avec des int est influence
par les exigences de la norme pour >> sur des chaines de caracteres.

Je sais bien que >> pour des int est aussi influence par les locales, mais
je ne vois pas de raisons pour laquelle avoir une virgule comme separateur
decimal doit rendre invalide "1," comme entree d'entier (il ne doit par
exemple pas y avoir d'erreur pour "1.2.3" dans la locale "C", la seule
decrite par la norme alors que . y est le separateur decimal).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Alain Gaillard

Je sais bien que >> pour des int est aussi influence par les locales, mais
je ne vois pas de raisons pour laquelle avoir une virgule comme separateur
decimal doit rendre invalide "1," comme entree d'entier (il ne doit par
exemple pas y avoir d'erreur pour "1.2.3" dans la locale "C", la seule
decrite par la norme alors que . y est le separateur decimal).


Je n'ai pas dis "doit" rendre invalide. J'ai dit que ça se pouvait,
éventuellement si bug dans l'implémentation il y a (ça semble être le
cas, voir post de Sylvain Togni plus haut) ou si dans la locale utilisée
"," n'est pas un séparateur. Sur le fond je suis d'accord avec toi et
c'est bien pour ça que j'ai fait une réponse de normand :)

--

Alain

Avatar
Alexandre
"Alain Gaillard" a écrit dans le message de
news:



istringsteam est declare dans sstream.

istrstream est officiellement obsolete.


C++ Builder 6 aussi. ;-)


dans mon post j'indiquais utiliser C++ Builder 2006, pas la version 6 ;-)


1 2