您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记(一)

2016-01-07 20:47 302 查看
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’起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

备注:在这个程序中,还没有弄清楚结构体数组的用法。因此结果虽然正确,但是程序有可能可以简化。至于这一块下一次看到了再弄清楚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: