当前位置:C++技术网 > 精选软件 > C++ Primer Plus 6th 4.13 编程练习题 第8题 new分配内存和去除多余的输入流的回车符号

C++ Primer Plus 6th 4.13 编程练习题 第8题 new分配内存和去除多余的输入流的回车符号

更新时间:2019-03-28 19:23:54浏览次数:1+次

C++ Primer Plus编程练习4.13 第8题 new分配内存和去除多余的回车符号
题目:
8.完成编程练习7,但使用new来为结构分配内存,而不是声明一个结构变量。另外,让程序在请求输入比萨饼公司名称之前输入比萨饼的直径。

7.William Wingate从事比萨饼分析服务。对于每个披萨饼,他都需要记录下列信息:
●  披萨饼公司的名称,可以有多个单词组成。
●  披萨饼的直径。
●  披萨饼的重量。
请设计一个能够存储这些信息的结构,并编写一个使用这种结构变量的程序。程序将请求用户输入上述信息,然后显示这些信息。请使用cin(或它的方法)和cout。

答案:书上无答案。

C++技术网辅导详解解答:
    代码参考:

#include <iostream>
struct Pizza {
    char name[200];
    float diameter;//直径
    float weight;
};

int main()
{
    using namespace std;

    Pizza* p = new Pizza;
    cout << "请输入比萨饼的直径:";
    cin >> p->diameter;
    getchar();
    cout << "请输入比萨饼公司的名称:";
    cin.getline(p->name,200);
    cout << "请输入比萨饼的重量:";
    cin >> p->weight;

    cout << "您输入的比萨饼的信息:\n所属公司为:" << p->name << endl;
    cout << "直径为:" << p->diameter << endl;
    cout << "重量为:" << p->weight << endl;
    delete p;
    return 0;
}

    本题和上一题的区别在于,本题增加了动态分配内存和释放内存,还有颠倒了输入直径和公司名称的顺序。

    关于内存分配,可能新手很容易忘记的就是释放内存了。或者在没有使用完成的前提下先把内存给释放了。
    我们需要记住的是,自己分配了内存要自己释放,释放内存的时候要注意时机即释放内存的位置要正确。既不能提前释放,也不能不释放,更不能条件性的释放。内存只要被分配了,一定要释放。特别是一些代码,在if命中时写了释放,在未命中的情况下忘记了写释放。这样的条件释放,在实际的运行过程中是比较难以发觉的,程序越复杂,逻辑越多,就让现象越奇怪。
    在一开始学习和练习的时候就要特别注意内存分配和释放,养成好习惯。
    关于颠倒输入的顺序,需要说的是:当先输入直径的时候,因为获取的是数字,那么回车字符是留在了输入流里的。那么当接着获取公司名称的时候,在还没有从键盘输入的时候就已经获取到了回车符,那么名称的输入就结束了,然后就进入了第三个数据的输入。
    所以此时我们要处理掉这个多余的回车符号哦。处理办法就是将这个符号读取出来即可。我们使用getchar()函数就可以实现了。如果在这个过程中有很多其他的无用的字符,比如直径输入了1.2ddd,回车。尽管你使用getchar()读取了一个字符,然后后面还有 dd回车符等符号。所以,我们需要做个处理,将到回车符所有的字符都读取出来并丢弃,确保能够正常输入公司名称。这里就不做进一步的说明了,请自己尝试吧。