2015-10-12 3 views
0

Donc, je veux utiliser un flux de chaîne pour convertir des chaînes en entiers.Stringstream lors de l'itération à travers la chaîne ne fonctionne pas

supposons que tout est fait avec:

using namespace std; 

un cas de base qui semble fonctionner est quand je fais ceci:

string str = "12345"; 
istringstream ss(str); 
int i; 
ss >> i; 

qui fonctionne très bien.

laisse cependant dire que j'ai une chaîne définie comme:

string test = "1234567891"; 

et moi:

int iterate = 0; 
while (iterate): 
    istringstream ss(test[iterate]); 
    int i; 
    ss >> i; 
    i++; 

ce travail ne marche pas comme je veux. Essentiellement, je devais travailler individuellement sur chaque élément de la chaîne comme s'il s'agissait d'un nombre, donc je veux le convertir en un int d'abord, mais je ne peux pas sembler trop. Quelqu'un pourrait-il m'aider s'il vous plaît?

l'erreur que je reçois est:

In file included from /usr/include/c++/4.8/iostream:40:0, 
      from validate.cc:1: 
/usr/include/c++/4.8/istream:872:5: note: template<class _CharT, class _Traits, class _Tp> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) 
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x) 
^ 
/usr/include/c++/4.8/istream:872:5: note: template argument  deduction/substitution failed: 
validate.cc:39:12: note: ‘std::ostream {aka std::basic_ostream<char>}’ is not derived from ‘std::basic_istream<_CharT, _Traits>’ 
cout >> i >> endl; 
+0

Comment prévoyez-vous le flux de reconnaître où briser la chaîne en éléments individuels lorsque il n'y a pas de délimiteurs? – dasblinkenlight

+0

Si vous utilisez test [itérer], vous avez un caractère ASCII qui contient un chiffre.Pour convertir un caractère ASCII contenant un chiffre en un nombre, vous pouvez simplement soustraire '0'. 'int i = test [iteratet] - '0'' –

Répondre

1

Vous devez comprendre deux points.

  1. Si vous utilisez des index pour accéder à la chaîne, vous obtiendrez des caractères.
  2. istringstream requiert string comme paramètre et non comme caractère pour créer un objet.

vous maintenant dans votre code

int iterate = 0; 
    while (iterate): 
    /* here you are trying to construct istringstream object using 
which is the error you are getting*/ 
     istringstream ss(test[iterate]); 
     int i; 
     ss >> i; 

Pour corriger ce problème, vous pouvez approche suivante

istringstream ss(str); 
int i; 
while(ss>>i) 
{ 
    std::cout<<i<<endl 
} 
1

Qu'est-ce que vous avez besoin est quelque chose comme:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::string str = "12345"; 
    std::stringstream ss(str); 
    char c; // read chars 
    while(ss >> c) // now we iterate over the stringstream, char by char 
    { 
     std::cout << c << std::endl; 
     int i = c - '0'; // gets you the integer represented by the ASCII code of i 
     std::cout << i << std::endl; 
    } 
} 

Live on Coliru

Si vous utilisez à la place int c; comme le type de c, puis ss >> c lit l'entier entier 12345, i Au lieu de le lire char par char. Si vous avez besoin de convertir ASCII c à l'entier qu'il représente, soustraire '0' de celui-ci, comme int i = c - '0';

EDIT Comme @dreamlax mentionné dans le commentaire, si vous voulez juste lire les caractères de la chaîne et les convertir en entiers, il n'est pas nécessaire d'utiliser un stringstream. Vous pouvez simplement parcourir la chaîne initiale en tant que

for(char c: str) 
{ 
    int i = c - '0'; 
    std::cout << i << std::endl; 
} 
+0

Il ne sert à rien d'utiliser une chaîne si vous ne faites qu'opérer sur les caractères individuels de la chaîne. Peut également parcourir la chaîne avec des itérateurs. 'pour (char c: str) std :: cout << (c - '0');' – dreamlax

+0

@dreamlax C'est vrai, je suppose que j'ai écris l'extrait ci-dessus juste pour montrer comment 'stringstream' fonctionne. – vsoftco