以下代码将提供的字符串/行拆分为字符。为什么循环重复最后一次字符串两次?如何解决?
#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
我已尽可能删除与问题无关的元素
答案 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}}