getline 的替代品
Alternatives of getline
#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;
}
第一次 getline()
完美运行,但第二次调用时,由于某些 cin >> value;
已在其之前执行,因此被跳过。
我尝试在 getline()
之前添加 cin.ignore()
,但它要么要求我在输入之前按回车键,要么跳过第一个输入的第一个字符。
但是,如果我在每个 cin >> value;
块结束后添加 cin.ignore()
,它会起作用。
所以我突然要到处加上cin.ignore()
因为一个getline()
?
或者 getline()
是否有其他方法可以将空格作为输入?
不幸的是,行为完全符合规范。 std::getline
按预期工作。
您需要阅读有关格式化输入和未格式化输入的内容,以了解为什么按原样实现它。
但是,您正在寻找解决方案。
基本上有3个:
- 在格式化输入后使用
ignore
。不幸的是,在每次格式化输入后
- 在您的输入语句中附加一个
get
,例如 (cin >> pageCount).get();
。同样,不幸的是在每次格式化输入后
- 在
std::getline
中使用std::ws
操纵器。喜欢:getline(cin >> ws, title);
。这将吃掉 潜在的 前导空格,包括换行符。
请参阅文档 here。
它还有一个额外的好处,如果用户在标题前输入不必要的空格,这些空格将被忽略。示例:输入:" This is the title"
将读取 "This is the title"
,没有前导空格。
所以,可以做的是:使用
getline(cin >> ws, title);
它会起作用。
请#include <iomanip>
#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;
}
第一次 getline()
完美运行,但第二次调用时,由于某些 cin >> value;
已在其之前执行,因此被跳过。
我尝试在 getline()
之前添加 cin.ignore()
,但它要么要求我在输入之前按回车键,要么跳过第一个输入的第一个字符。
但是,如果我在每个 cin >> value;
块结束后添加 cin.ignore()
,它会起作用。
所以我突然要到处加上cin.ignore()
因为一个getline()
?
或者 getline()
是否有其他方法可以将空格作为输入?
不幸的是,行为完全符合规范。 std::getline
按预期工作。
您需要阅读有关格式化输入和未格式化输入的内容,以了解为什么按原样实现它。
但是,您正在寻找解决方案。 基本上有3个:
- 在格式化输入后使用
ignore
。不幸的是,在每次格式化输入后 - 在您的输入语句中附加一个
get
,例如(cin >> pageCount).get();
。同样,不幸的是在每次格式化输入后 - 在
std::getline
中使用std::ws
操纵器。喜欢:getline(cin >> ws, title);
。这将吃掉 潜在的 前导空格,包括换行符。
请参阅文档 here。
它还有一个额外的好处,如果用户在标题前输入不必要的空格,这些空格将被忽略。示例:输入:" This is the title"
将读取 "This is the title"
,没有前导空格。
所以,可以做的是:使用
getline(cin >> ws, title);
它会起作用。
请#include <iomanip>