C++PrimerPlus 课后习题第四章第8题(4.8)为什么getline()接受不到数据

本文介绍了在C++编程中,使用cin和getline进行用户输入时可能出现的问题。当先使用cin读取数值,然后使用getline读取字符串时,由于cin在读取完数值后留下的换行符会干扰getline的正常工作。解决方法包括使用cin.get()或cin.ignore()来清除缓冲区的换行符,确保后续的字符串输入不受影响。示例代码展示了如何正确处理这种情况。
摘要由CSDN通过智能技术生成

第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,空格,换行符的字符)起开始计入输入,所以当前面有换行符时,并不会干扰输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值