2009-08-07 7 views
1

Voici ma fonction. Je l'appelle avecpourquoi cette conversion ne fonctionne pas?

if(try_strtol(v, rhs)) 

et ERS = "15 \ t // commentaire"

bool try_strtol(int64_t &v, const string& s) 
{ 
    try 
    { 
     std::stringstream ss(s); 
     if ((ss >> v).fail() || !(ss >> std::ws).eof()) 
      throw std::bad_cast(); 
     return true; 
    } 
    catch(...) 
    { 
     return false; 
    } 
} 

Il retourne false, i, sauf le cas avec v = 15. Comment puis-je réparer ça?

+0

Pourquoi pensez-vous que cela deviendra vrai? À quoi vous attendez-vous?! (Ss >> std :: ws) .eof() 'pour évaluer? ou '(s >> v) .fail()' d'ailleurs? –

+3

Étape 1: Arrêtez d'essayer d'être intelligent. Brisez l'expression pour qu'elle soit lisible, vous ne faites rien à personne. Surtout toi-même. Une fois que vous l'avez travaillé avec un ensemble de tests unitaires, essayez votre petite astuce d'optimisation pour voir si cela fonctionne encore. –

+1

En fait, j'ai écrit ça Martin. http://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/1243435#1243435 – GManNickG

Répondre

2

Si vous voulez revenir un booléen, faites juste ceci:

bool try_strtol(int64_t &v, const string& s) 
{ 
    std::stringstream ss(s); 
    return (ss >> v).fail() || !(ss >> std::ws).eof(); 
} 

Et il est défaillant parce qu'il est un mauvais casting. Espériez-vous que le commentaire serait ignoré?

+0

Oui: D. Ma connaissance de cours d'eau est médiocre et je suis au milieu des devoirs qui me sont dus en 2h (j'ai 4 heures pour le faire, j'étais absent). Je demande plutôt comment convertir correctement un int puis écrire moi-même une mauvaise version. –

+0

oups, je n'ai pas expliqué hier après. Je l'ai commencé avant d'aller me coucher. Je me suis réveillé il y a 1h. –

+0

oh et merci encore pour ces deux réponses: D –

4

Pourquoi pensez-vous que (ss >> std::ws).eof() est vrai? rhs contient des caractères non-espaces après 15, donc la condition if sera vraie et l'exception sera levée, c'est pourquoi elle retourne false.

3

Après que std :: ws a ignoré l'onglet, vous n'êtes pas encore à l'étape eof.

+0

j'ai complètement raté ça. Je ne comprenais pas assez les cours d'eau et je me précipitais –

0

Si vous vous attendiez à ce que l'E/S de flux traite les commentaires C++ comme des espaces, ce n'est pas le cas.

Questions connexes