做..while() 将最后一个字符串重复两次
do...while() repeating the last string twice
以下代码将提供的字符串/行拆分为字符。为什么循环会重复最后一个字符串两次?如何解决?
#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;
}
相关文章:
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- C++ 链表程序打印最后一个数据项 n 次
- 我用C++做了一个计算器,但我对"type of calculator"的要求循环了两次。有人可以帮助指出我的错误吗?
- 当同一个程序被打开两次时,如何使用C ++杀死一个程序?
- std::getline 读取最后一个字符串两次
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- C++:对数组进行排序,最后一个数字重复两次
- 两次相同的 for 循环:一个编译,另一个不编译
- while 循环在一个函数调用中执行两次
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- 为什么输入文件的最后一行运行两次?
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 为什么基类被继承两次,即使其中一个是虚拟继承的
- 为什么我的单例实现两次启动?(一个进程,多个线程)
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- c ++ 如何阻止我的循环两次吐出最后一个输入
- 做..while() 将最后一个字符串重复两次
- 为什么 ifstream 返回输入文件的最后一个值两次
- 尝试从输入文件打印,但打印最后一个输入两次
- 我正在尝试递归地实现一个程序。我只是不明白为什么我的最后一行被执行了两次