C ++ cin问题。没有捕获用户的输入

时间:2010-03-20 22:57:53

标签: c++ stdin std cin

我有以下方法没有捕获用户的任何内容。如果我为艺术家名称输入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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

这是指定的行为; istream只能读取空格或换行符。如果您想要整行,可以使用getline方法,就像您已经发现的那样。

此外,请在任何新的C ++代码中使用std::string而不是char*,除非有充分的理由。在这种情况下,它将为您免除缓冲区溢出等各种问题,而无需您做任何额外的努力。

答案 2 :(得分:0)

如果您的输入中有空格分隔符,则需要使用getline作为输入。这会使你的忽略不必要。