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’起作用,所以這一句就是把斷行符號(包括斷行符號)之前的所以字元從輸入緩衝(流)中清除出去。
備忘:在這個程式中,還沒有弄清楚結構體數組的用法。因此結果雖然正確,但是程式有可能可以簡化。至於這一塊下一次看到了再弄清楚。