#include <iostream>
using namespace std;
class publication {
private:
string title;
float price;
public:
publication() {
this->title = "";
this->price = 0.0;
}
void getdata() {
cout << "Enter Title: ";
getline(cin, title);
cout << "Enter price: ";
cin >> this->price;
}
void putdata() {
cout << "Title: " << title << endl;
cout << "Price: " << price << endl;
}
};
class book : public publication {
private:
int pageCount;
public:
book() { this->pageCount = 0; }
void getdata() {
publication::getdata();
cout << "Enter page count: ";
cin >> pageCount;
}
void putdata() {
publication::putdata();
cout << "Page Count: " << pageCount << " pages\n";
}
};
class tape : public publication {
private:
float playingTime;
public:
tape() { this->playingTime = 0; }
void getdata() {
publication::getdata();
cout << "Enter playing time: ";
cin >> playingTime;
}
void putdata() {
publication::putdata();
cout << "Playing Time: " << playingTime << " mins\n";
}
};
int main() {
book b;
tape t;
b.getdata();
t.getdata();
b.putdata();
t.putdata();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一次getline()工作完美,但第二次调用它时,它被跳过,因为cin >> value;在它之前已经执行了一些。我尝试添加cin.ignore()before getline(),但它要么要求我在输入之前按 Enter 键,要么跳过第一个输入的第一个字符。
但是,如果我cin.ignore()在每个cin >> value;块的末尾添加,它就可以工作。
所以我必须cin.ignore()因为一个而突然到处添加getline()?或者有没有其他选择getline()可以将空格作为输入?
不幸的是,行为完全符合规范。std::getline按预期工作。
您需要阅读有关格式化输入和未格式化输入的信息,以了解为什么按原样实现它。
但是,您正在寻找解决方案。基本上有3种:
ignore在格式化输入后使用。不幸的是在每次格式化输入之后get到您的输入语句中,例如(cin >> pageCount).get();. 再次,不幸的是在每次格式化输入之后std::ws操纵器std::getline。喜欢:getline(cin >> ws, title);。这将吃掉潜在的领先空白,包括换行符。请参阅此处的文档。
它的另一个优点是,如果用户在标题前输入了不必要的空格,这些空格将被忽略。示例: Input: " This is the title"will read "This is the title",没有前导空格。
那么,可以做的是:使用
getline(cin >> ws, title);
Run Code Online (Sandbox Code Playgroud)
它会起作用。
请 #include <iomanip>
| 归档时间: |
|
| 查看次数: |
3018 次 |
| 最近记录: |