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 ответа
Есть два момента, которые вы должны понять.
- Если вы используете индексы для доступа к строке, вы получите символы.
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;
}