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

do...while() repeating the last string twice

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

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

输入:

hello world

期望的输出

hello
h
e
l
l
o
world
w
o
r
l
d

实际输出:

hello
h
e
l
l
o
world
w
o
r
l
d
world
w
o
r
l
d

我已经尽量去掉了与问题无关的元素

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

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

此外,我想指出的是,您可以遍历一个字符串,因为它可以被视为一个 char*,因此您不需要向量转换的东西。

问题是如果设置了 failbit 或 badbit,则 istream 的 conversion to bool 仅 returns false,但如果流为空则不会。例如,在您尝试从空的 istream 中提取字符串后,会设置 failbit。这就是为什么你的循环多运行一次的原因:当 istream 为空时,没有设置 failbit,只有在额外的迭代中没有字符串可以被提取之后,才会设置 failbit 并且循环终止。一种解决方案是使用:

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