考虑此代码段
void make(int n)
{
std::string user_input;
std::istringstream iss(user_input);
char letter;
int index;
while(n>0)
{ cout<<n<<endl;
std::getline(std::cin, user_input);
while (iss >> letter >> index)
cout<<letter<<' '<<index;
n--;
}
}
int main()
{ int n;
cin>>n;
make(n);
return 0;
}
此处循环未正确运行
如果我把n = 5,那么输出是
5
// getline不起作用
4
然后getline工作......为什么这个
答案 0 :(得分:1)
之所以这样做,是因为当您拨打getline()
时,它正在cin
中使用“{1}}中的内容并将其放入变量。但是,当您最初调用cin
以接收初始输入时,换行符会在进入make()
函数后保留在缓冲区中。
因此,当您进入循环时,第一个getline()
从'\n'
获取cin
,并清除缓冲区。这就是为什么它似乎&#34;跳过&#34;看似第一次迭代。
因此,为了使其正常运行,您应该在使用cin.ignore()
调用函数时清除输入缓冲区,如下所示:
void make(int n)
{
cin.ignore(1000,'\n'); //ignores 1000 characters or until sees \n
std::string user_input;
std::istringstream iss(user_input);
char letter;
int index;
while(n>0)
{ cout<<n<<endl;
std::getline(std::cin, user_input);
while (iss >> letter >> index)
cout<<letter<<' '<<index;
n--;
}
}
int main()
{ int n;
cin>>n;
make(n);
return 0;
}
我最近还没有使用过c ++,所以目前我还不确定是否有更好的方法来处理这个问题,但这应该会给你一个很好的指导。