遍历字符串时 Stringstream 不起作用
Stringstream when iterating through string doesnt work
所以我想使用字符串流将字符串转换为整数。
假设一切都已完成:
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;
你需要的是:
#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';
EDIT 正如@dreamlax在评论中提到的,如果你只想读取字符串中的字符并将它们转换为整数,则无需使用 stringstream
。您可以迭代初始字符串 as
for(char c: str)
{
int i = c - '0';
std::cout << i << std::endl;
}
有两点你应该明白。
- 如果你使用索引访问字符串,你会得到字符。
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
}
所以我想使用字符串流将字符串转换为整数。
假设一切都已完成:
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;
你需要的是:
#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';
EDIT 正如@dreamlax在评论中提到的,如果你只想读取字符串中的字符并将它们转换为整数,则无需使用 stringstream
。您可以迭代初始字符串 as
for(char c: str)
{
int i = c - '0';
std::cout << i << std::endl;
}
有两点你应该明白。
- 如果你使用索引访问字符串,你会得到字符。
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
}