Проблемы с Cin Cin. не захватывает ввод от пользователя - PullRequest
1 голос
/ 21 марта 2010

У меня есть следующий метод, который ничего не захватывает от пользователя. Если я ввожу New Band в качестве имени исполнителя, он захватывает только «New» и выдает «Band». Если я использую cin.getline (), то ничего не захватывается. Есть идеи как это исправить?

char* artist = new char [256];

char * getArtist()
{
    cout << "Enter Artist of CD: " << endl;
    cin >> artist;      
    cin.ignore(1000, '\n');
    cout << "artist is " << artist << endl;
    return artist;
}

Это сработало просто отлично. Спасибо, Роджер

std::string getArtist()

{   

    cout << "Enter Artist of CD: " << endl;

    while(true){            

        if ( getline(cin, artist)){

        }

    cout << "artist is " << artist << '\n';

    }

    return artist;

}

Ответы [ 3 ]

2 голосов
/ 21 марта 2010
std::string getArtist() {
  using namespace std;
  while (true) {
    cout << "Enter Artist of CD: " << endl;
    string artist;
    if (getline(cin, artist)) {             // <-- pay attention to this line
      if (artist.empty()) { // if desired
        cout << "try again\n";
        continue;
      }
      cout << "artist is " << artist << '\n';
      return artist;
    }
    else if (cin.eof()) { // failed due to eof
      // notice this is checked only *after* the
      // stream is (in the above if condition)

      // handle error, probably throw exception
      throw runtime_error("unexpected input error");
    }
  }
}

Все это общее улучшение, но использование getline , возможно, является наиболее значимым для вашего вопроса.

void example_use() {
  std::string artist = getArtist();
  //...

  // it's really that simple: no allocations to worry about, etc.
}
1 голос
/ 21 марта 2010

Это указанное поведение; istream s читать только до пробела или новой строки. Если вам нужна целая строка, вы используете метод getline, как вы уже обнаружили.

Также, пожалуйста, используйте std::string вместо char* в любом новом коде C ++, если только для этого нет веских причин. В этом случае это избавит вас от всевозможных проблем, таких как переполнение буфера, без каких-либо дополнительных усилий с вашей стороны.

0 голосов
/ 21 марта 2010

Если вы собираетесь использовать разделители пробелов на входе, вам нужно использовать getline для ввода.Это сделало бы ваше игнорирование ненужным.

...