想請問一下前輩們,
有關a002的while()內,
範例a001是填入cin<<...,
為什麼我不能填scanf()等,
比如說a002,
用cin寫會過但scanf不行,
此二者實際上有什麼差異呢?
謝謝。
C中的scanf()會回傳匹配成功的個數,如果讀到檔案結尾符,才回傳EOF(值要視編譯器決定,通常是-1)。用Windows作業系統的話,Ctrl+Z就是檔案結尾符。
現在下面的輸入都是用scanf("%d %d %d",&a,&b,&c)去讀,
Ex 1: Input為2 5 6,會得到3,因為這三個數字都會讀進a,b,c中。
Ex 2: Input為4 6 z,會得到2,因為只有4 6被存進a,b中,而z並非數字,讀不進c。而此時檔案指標停在z這兒。
Ex 3: Input為4 z 7,會得到1,因為在讀z的時候不合,強制結束scanf()的讀取,並回傳。
此例中再加入scanf("%c",&ch),會回傳1,因為z確實可視作字元而讀進ch。
再接下來又加入scanf("%d %d %d",&d,&e,&f),會回傳1,是因為只有7讀進d且e,f沒被讀進東西。
Ex 4: Input為k z 7,會得到0,因為在讀k的時候不合,強制結束scanf()的讀取,並回傳。而此時檔案指標停在k這兒。
Ex 5: Input為 ,會得到EOF,因為根本沒東西了(正確說,是讀到了檔案結尾符)。
C++中的cin是istream類別中的物件,所以有了運算子多載的設計。其中就有定義<<的多載,而<<的多載會回傳istream類別的物件。
簡單地用cin<<a<<b做例子:
cin<<a<<b;
(cin<<a)<<b;//將執行<<多載並回傳cin
(cin)<<b;
(cin<<b);//將執行<<多載並回傳cin
cin;
這時,cin會有一套機制(也是用運算子多載來實現)回傳當前的內部狀態。只有當讀到檔案結尾符或不預期錯誤時,這個狀態才會以0來表示。
我認為兩者實質上最大的差異就是:scanf()是函式而cin是物件。