C++学习笔记(一)

C++
Primer Plus习题
第五章编程练习7:设计一个名为car的结构,用它存储下述有关汽车的信息:生产商(存储在字符数组或string对象中的字符串)、生产年份(整数)。编写一个程序,向用户询问有多少辆车。随后,程序使用new来创建一个由相应数量的car结构组成的动态数组。
我编的程序如下:

include

using namespace std;
struct car
{
char maker[20];
int years;
};
int main()
{
int i_limit,i;
cout<<”How many cars do you wish to catalog? “;
cin>>i_limit;

car *ps=new car[i_limit];
for(i=0;i<i_limit;i++)
{
    cout<<"Car #"<<i+1<<": "<<endl;
    cout<< unitbuf <<"Please Enter the maker: ";
    ******//cin.ignore();
    //fflush(stdin);******
    cin.getline(((ps+i)->maker),20);
    cout<<endl<<"Please Enter the year made: ";
    cin>>(ps+i)->years;
    cout<<endl;
}
cout<<"Here is your collection: "<< endl;
for(i=0;i<i_limit;i++)
{
    cout<<(ps+i)->years<<"  "<<(ps+i)->maker<<endl;
}
delete [] ps;
cin.get();
cin.get();
return 0;

}
斜体部分注释掉之后结果如下:
程序没有等待输入maker这里写图片描述

使用cin.ignore();或者fflush(stdin);清除缓存之后就可以完成习题要求了。
这里写图片描述

学习心得:
不使用cin.ignore()时,没有等待输入maker。主要是因为cin.getline的读取原理,它是将以‘/n’为结束符做为一完整读取的一行,’/n’会读但不会赋值给数组。所以当之前用cin读取一个字符的时候,你会输入一个字符然后点击回车,那么下面cin.getline读的时候会读入这个回车,并判断结束了,然后赋值给数组第一行,这样数组第一行就是空行。

扩展来说,cin.ignore()的用法如下:
cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,’\n’),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数’\n’起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

备注:在这个程序中,还没有弄清楚结构体数组的用法。因此结果虽然正确,但是程序有可能可以简化。至于这一块下一次看到了再弄清楚。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值