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回车符等符号。所以,我们需要做个处理,将到回车符所有的字符都读取出来并丢弃,确保能够正常输入公司名称。这里就不做进一步的说明了,请自己尝试吧。