2015-10-12 2 views
0

Итак, я хочу использовать строковый поток для преобразования строк в целые числа.Stringstream, когда итерация через строку не работает

считать, все сделано с:

using namespace std; 

основной случай, который, кажется, работает, когда я делаю это:

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

работает отлично.

Однако позволяет сказать, что у меня есть строка определяется как:

string test = "1234567891"; 

и я:

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

это не работает, как я хочу. по существу я должен был индивидуально работать над каждым элементом строки, как если бы это был номер, поэтому я хочу сначала преобразовать его в int, но я тоже не могу. Может кто-нибудь, пожалуйста, помогите мне?

ошибка я получаю:

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

Как вы можете ожидать поток, чтобы понять, где разбить строку на отдельные элементы, когда нет разделителей? – dasblinkenlight

+0

Если вы используете test [iterate], то у вас есть символ ASCII, содержащий цифру.Чтобы преобразовать символ ASCII, содержащий цифру в число, вы можете просто вычесть «0». 'int i = test [iteratet] - '0'' –

ответ

1

Есть два момента, которые вы должны понимать.

  1. Если вы используете индексы для доступа к строке, вы получите символы.
  2. istringstreamstring как параметр не символы для создания объекта.

Теперь в вашем коде

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; 

Чтобы устранить эту проблему, вы можете следующий подход

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

Что вам нужно что-то вроде:

#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

Если вы используете int c; вместо как тип c, то ss >> c читает целое число 12345, i вместо считывания char по char. В случае, если вам нужно преобразовать ASCII c в целое число, которое он представляет, вычесть '0' из него, как int i = c - '0';

EDIT Как @dreamlax упоминалось в комментариях, если вы просто хотите, чтобы прочитать эти символы в строке и конвертировать их в целые числа, нет необходимости использовать stringstream. Вы можете просто перебрать исходную строку как

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

Нет смысла использовать строковый поток, если вы просто собираетесь перебирать отдельные символы в строке. Может также перебирать строку с помощью итераторов. 'for (char c: str) std :: cout << (c - '0');' – dreamlax

+0

@dreamlax Это правда, я думаю, что я написал фрагмент выше, чтобы показать, как работает 'stringstream'. – vsoftco

Смежные вопросы