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;

2 ответа

Решение

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

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

Теперь вы в своем коде

    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
}

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

#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;
    }
}

Жить на Колиру

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

РЕДАКТИРОВАТЬ Как @dreamlax упоминается в комментарии, если вы просто хотите прочитать символы в строке и преобразовать их в целые числа, нет необходимости использовать stringstream, Вы можете просто перебрать начальную строку как

for(char c: str)
{
    int i = c - '0';
    std::cout << i << std::endl;
}
Другие вопросы по тегам