do ... while()重复最后一个字符串两次

时间:2016-02-15 18:08:43

标签: c++ do-while istringstream

以下代码将提供的字符串/行拆分为字符。为什么循环重复最后一次字符串两次?如何解决?

#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string main, sub;
    cout << "Enter string: ";
    getline(cin, main);
    istringstream iss(main);
    do
    {
        iss >> sub;
        cout << sub << endl;
        vector<char> v(sub.begin(), sub.end());
        for(int i = 0; i < v.size(); i++)
         {
             cout << v[i] << endl;
         }
    } while (iss);
    return 0;
}

输入:

  

你好世界

期望的输出

  

您好
  ^ h
  Ë
  升
  升
  Ø
  世界
  w ^
  Ø
  [R
  升
  d

实际输出:

  

您好
  ^ h
  Ë
  升
  升
  Ø
  世界
  w ^
  Ø
  [R
  升
  d
  世界
  w ^
  Ø
  [R
  升
  d

我已尽可能删除与问题无关的元素

2 个答案:

答案 0 :(得分:7)

在上一次运行中,iss引发了一个失败,因此sub的值没有更新,导致重复发生。一种看待这种情况的方法是在do循环开始时将sub设置为空字符串。为了避免这种问题,我会做类似以下的事情

while(iss>>sub){
  cout<<sub<<endl;
  etc
}

另外,我想指出你可以迭代一个字符串,因为它可以被视为char *,所以你不需要矢量转换。

答案 1 :(得分:3)

问题是,如果设置了failbit或badbit,则istream的conversion to bool仅返回false,但如果流为空则不返回#include <iostream> #include <vector> #include <sstream> #include <string> using namespace std; int main() { string main, sub; cout << "Enter string: "; getline(cin, main); istringstream iss(main); while(iss >> sub) { cout << sub << endl; vector<char> v(sub.begin(), sub.end()); for(int i = 0; i < v.size(); i++) { cout << v[i] << endl; } } return 0; } 。例如,在尝试从空istream中提取字符串后,failbit就会设置为set。这就是你的循环运行一次的原因:当istream为空时,不设置failbit,只有在额外的迭代中没有提取字符串后,才会设置失败位并且循环终止。解决方案可以是使用:

{{1}}