第8题比起第7题,要求在输入比萨饼公司名称之前输入披萨饼的直径。
为了防止有空格的名字录入失败的问题,在录入名字时,通常采用getline()来录入更为稳妥。
代码如下(第7题):
#include <iostream>
#include <string>
using namespace std;
#pragma warning(disable:4996);
struct Pizza
{
string name;
float d;
float weight;
};
int main()
{
Pizza *snack=new Pizza ;
cout << "请输入名字:";
getline(cin, snack->name);
cout << "请输入直径:";
cin >> snack->d;
cout << "请输入重量:";
cin >> snack->weight;
cout << snack->name << endl << snack->d << "\n" << snack->weight << "\n";
return 0;
}
第8题比起第7题,提出要在输入比萨饼公司名称之前输入披萨饼的直径。故我们将代码改成这样:
#include <iostream>
#include <string>
using namespace std;
#pragma warning(disable:4996);
struct Pizza
{
string name;
float d;
float weight;
};
int main()
{
Pizza *snack=new Pizza ;
cout << "请输入直径:";
cin >> snack->d;
cout << "请输入重量:";
cin >> snack->weight;
cout << "请输入名字:";
getline(cin, snack->name);
cout << snack->name << endl << snack->d << "\n" << snack->weight << "\n";
return 0;
}
这个时候,我们运行程序会出现名字无法录入的情况。
这是因为getline(cin,str);默认是以回车键输入的换行符来确认输入结尾的。
当我们输入完重量后,会按下回车键作为确认。这个时候换行符就会被放入缓存区,然后被getline(cin,str);读取到。为了避免这个问题,我们可以设置一个cin.get()来接收缓存。
如下:
Pizza *snack=new Pizza ;
cout << "请输入直径:";
cin >> snack->d;
cout << "请输入重量:";
cin >> snack->weight;
cout << "请输入名字:";
cin.get();
getline(cin, snack->name);
cout << snack->name << endl << snack->d << "\n" << snack->weight << "\n";
return 0;
当然我们也可以通过cin.ignore();来清空缓存。
如下图:
Pizza *snack=new Pizza ;
cout << "请输入直径:";
cin >> snack->d;
cout << "请输入重量:";
cin >> snack->weight;
cout << "请输入名字:";
cin.ignore(10, '\n');
getline(cin, snack->name);
cout << snack->name << endl << snack->d << "\n" << snack->weight << "\n";
return 0;
如果我们不考虑披萨的名字中有空格,而是单纯地用cin>>snack->name;来进行输入。这个时候的程序并没有什么问题。
Pizza *snack=new Pizza ;
cout << "请输入直径:";
cin >> snack->d;
cout << "请输入重量:";
cin >> snack->weight;
cout << "请输入名字:";
cin >> snack->name;
cout << snack->name << endl << snack->d << "\n" << snack->weight << "\n";
return 0;
这是因为cin是以第一个非空字符(除了制表符tab,空格,换行符的字符)起开始计入输入,所以当前面有换行符时,并不会干扰输入。