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

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

本文关键字:两次 最后一个 while 字符串      更新时间:2023-10-16

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

#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
e
l
l
o
世界
w
o
r
l
d

实际输出:

你好
h
e
l
l
o
世界
w
o
r
l
d
世界
w
o
r
l
d

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

在最后一次运行中,iss 引发故障,因此 sub 的值不会更新,从而导致重复发生。查看此问题的一种方法是在 do 循环开始时将 sub 设置为空字符串。为了避免此类问题,我会做如下事情

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

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

问题是,istream 转换为布尔值仅在设置了故障位或坏位时才返回false,但如果流为空则不会返回。例如,失败位是在您尝试从空 istream 中提取字符串后设置的。这就是为什么你的循环运行次数多一次:当 istream 为空时,不会设置故障位,只有在额外的迭代中无法提取字符串后,才会设置失败位并终止循环。解决方案可以是使用:

#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;
}
相关文章: