ошибка в цикле - PullRequest
       28

ошибка в цикле

0 голосов
/ 26 февраля 2012

рассмотрите этот фрагмент кода

   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 Ответ

1 голос
/ 26 февраля 2012

Причина, по которой он это делает, заключается в том, что когда вы вызываете getline(), он берет то, что находится в cin, и помещает его в переменную. Однако, когда вы изначально вызывали cin для получения начального ввода, символ новой строки оставался в буфере после перехода в вашу функцию make().

Поэтому, когда вы входите в цикл, первый getline() берет '\n' из cin, и буфер очищается. Вот почему он, кажется, «пропускает» первую итерацию, как кажется.

Таким образом, чтобы заставить его работать правильно, вы должны очистить входной буфер при вызове вашей функции, используя 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 ++, поэтому в настоящий момент я не уверен, есть ли лучший способ справиться с этим, но это должно дать вам хорошее направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...