почему Cin пропускается в C ++? - PullRequest
0 голосов
/ 13 декабря 2018

У меня простой вопрос, но любой делает меня известным.ниже приведен простой код.

#include <iostream>
#include <string>
using namespace std;

int main(){
 string ans;
 while(true){
  cin >> ans;
  cout << "ans : " << ans << endl;
 }
}

Я набираю usa canada england island и ввожу !!

Показывает результат ниже

usa canada england island

ans : usa

ans : canada

ans : england

ans : island

hello world

ans : hello

ans : world

Почему пропускается секунда cin ??Как это работает в потоковом буфере?

Пожалуйста, ответьте на мой вопрос спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Каждый раз, когда вы используете cin >> ans, ans перезаписывается.Если вы хотите продолжить получать ввод после первого пробела, вам нужно использовать цикл, который проверяет клавишу ввода с помощью std::cin.peek() (или вместо этого использовать что-то вроде std::getline()), например

#include <iostream>
#include <string>

int main() {
  std::string ans;
  std::cout << "Input: " << std::flush;
  while (std::cin.peek() != '\n') {
    std::cin >> ans;
  }
  std::cout << "ans: " << ans << std::endl;
}

Но вывод здесь, если ввод hello world будет

ans: world

Почему?Поскольку ans был перезаписан, существует два простых способа: использовать массив или вектор для хранения каждого cin отдельно или объединить их все.

Первый метод

#include <iostream>
#include <string>
#include <vector>

int main() {
  std::vector<std::string> answers;
  std::string ans;
  std::cout << "Input: " << std::flush;
  while (std::cin.peek() != '\n') {
    std::cin >> ans;
    answers.push_back(ans);
  }
  std::cout << "ans: ";
  for (int ii = 0; ii < answers.size(); ii ++) {
    std::cout << answer[ii] << " ";
  }
  std::cout << std::endl;
}

Который будет выводить (формат вывода можно легко настроить)

ans: hello world

Второй метод

#include <iostream>
#include <string>

int main() {
  std::string ans;
  std::string answers = "";
  std::cout << "Input: " << std::flush;
  while (std::cin.peek() != '\n') {
    std::cin >> ans;
    answers += ans+" ";
  }
  std::cout << "ans: " << answers << std::endl;
}

Который аналогично будет выводить

ans: hello world

Первый метод более гибок - каждый вход поддерживается отдельно в std::vector, и они могут быть выведены или обработаны по мере необходимости, второй метод проще только вчто он не требует включения STL.

0 голосов
/ 13 декабря 2018

Я думаю, что вы, возможно, захотите использовать std :: getline , если ваша цель - вывести все введенные данные, а не разделять каждый элемент.

int main(){
  string ans;
  while(true){
    getline(cin, ans);
    cout << "ans : " << ans << endl;
  }
}
...