我有以下方法没有捕获用户的任何内容。如果我为艺术家名称输入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;
}
答案 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作为输入。这会使你的忽略不必要。