循环错误

时间:2012-02-26 04:29:24

标签: c++ stream

考虑此代码段

   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工作......为什么这个

1 个答案:

答案 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 ++,所以目前我还不确定是否有更好的方法来处理这个问题,但这应该会给你一个很好的指导。