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;
}
以下代码将提供的 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;
}