当迭代字符串时使用 stringstream 无法工作

4
我将使用字符串流将字符串转换为整数。
假设一切工作完成:
 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++;

这并不按照我想要的方式工作。实际上,我希望分别处理字符串中的每个元素,就像它是一个数字一样,所以我想先将它转换为整数,但我似乎做不到。请有人能帮我吗?

我得到的错误是:

   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;

当没有分隔符时,你希望流如何识别字符串中的各个元素的分割位置呢? - Sergey Kalinichenko
如果您正在使用test[iterate],那么您有一个包含数字的ASCII字符。要将包含数字的ASCII字符转换为数字,您只需减去'0'即可。int i = test[iteratet] - '0' - Jerry Jeremiah
2个回答

4
你需要的是类似这样的东西:

您需要的是类似以下内容:

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

在Coliru上实时演示

如果您使用int c;作为c的类型,那么ss >> c将读取整个整数12345,而不是逐个字符地读取它。 如果您需要将ASCII c转换为它所代表的整数,则从中减去'0',例如int i = c - '0';

编辑 如@dreamlax在评论中提到的那样,如果您只想读取字符串中的字符并将它们转换为整数,则无需使用stringstream。 您可以直接迭代初始字符串,如下所示:

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

如果您只是要遍历字符串中的单个字符,那么使用stringstream就没有意义了。最好使用迭代器来遍历字符串。for (char c : str) std::cout << (c - '0'); - dreamlax
@dreamlax 这是真的,我想我上面写的代码片段只是为了展示stringstream的工作原理。 - vsoftco

3

有两个点你需要明白。

  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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接