我希望用户输入一个字符串,double和long,但事情是在第一次之后,字符串被忽略并留空并直接提示输入。
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main () {
string name;
double price;
long serial;
cout << "Enter the dvd's name: "; getline(cin, name);
cout << "Enter the dvd's price (in $): "; cin >> price;
cout << "Enter the dvd's serial number: "; cin >> serial;
cout << endl;
cout << "Enter the dvd's name: "; getline(cin, name);
cout << "Enter the dvd's price (in $): "; cin >> price;
cout << "Enter the dvd's serial number: "; cin >> serial;
return 0;
}
你可以看到第一次,我可以输入一个字符串,第二次只是直接发送给我的双倍,即使我忽略了丢失的字符串,并把一个双倍然后一个长,它将打印名称为空字符串。
我的代码出了什么问题?
答案 0 :(得分:1)
序列号后的空白(回车或空格)未被检索,然后getline
将其取出。
编辑:正如johnathon所指出的那样,cin >> ws
在这种情况下无法正常工作(我确定我之前使用过这个,但我找不到一个例子)
经过测试的解决方案:而是在序列号之后添加此项将从流中获取回车符(以及任何其他空格),以便为下一个DVD名称做好准备。
string dummy;
getline(cin, dummy);
答案 1 :(得分:1)
在这种情况下我通常使用istringstream(如下所示)。但更好的解决方案是使用cin.ignore
#include <sstream>
int main () {
string name,line;
double price;
long serial;
cout << "Enter the dvd's name: "; getline(cin, line);
name = line;
cout << "Enter the dvd's price (in $): ";
getline(cin,line);
istringstream(line)>>price;
cout << "Enter the dvd's serial number: ";
getline(cin,line);
istringstream(line)>>serial;
cout << endl;
return 0;
}