C 容易忽略的特性

2021-06-02 23:10:47 字數 4147 閱讀 6557

(1)cin----標準輸入流物件, 與標準輸入裝置相聯絡(通常指鍵盤)。

例如:  cin>>變數名;

「>>」為提取運算子(輸入運算子),表示從鍵盤讀取資料放入變數中。

(2) cout---標準輸出流(流物件), 與標準輸出裝置相聯絡(通常指顯示器)。

例如: cout<<「資料」;

「<<」為插入運算子(輸出運算子),表示將「資料」寫到顯示器上。

(3) cerr---非緩衝型的標準出錯流物件,與標準輸出裝置相聯絡(通常指鍵盤)。

(4) clog---緩衝型的標準出錯流,與標準輸出裝置相聯絡(通常指顯示器)。

cerr與clog均用來輸出出錯資訊。

cerr和clog之間的區別是:

cerr是不經過緩衝區,直接向顯示器上輸出有關資訊,因而傳送給它的任何內容都立即輸出;

clog中的資訊存放在緩衝區中,緩衝區滿後或遇上endl時向顯示器輸出。

只要在程式中包含標頭檔案iostream.h,c++程式開始執行時這四個標準流物件的建構函式都被自動呼叫。

使用者也可以用istream和ostream等類宣告自己的流物件.

例如istream  is;

ostream  os;

宣告了is為輸入流物件,宣告了os為輸出流物件。

輸入輸出流的成員函式

1.put函式

put函式常用的呼叫形式為:

cout.put(單字元);

cout.put(字元型變數);

功能: 用於輸出乙個字元

例如:cout.put('a');

它與語句:cout<<'a'; 等價,將字元a顯示在螢幕上

說明:(1) put函式的引數不但可以是字元,還可以是字元的ascii**(也可以是乙個整型表示式)。

例如以下語句都可以將字元a顯示在螢幕上:

cout.put(65);

或cout.put(20+45);

(2) 可以在乙個語句中連續呼叫put函式。

例如:cout.put(65).put(66),cout.put('\n');

2.get函式

常用的呼叫形式為:

cin.get(字元型變數)

功能: 是從輸入流中讀取乙個字元(包括空白符),賦給字元變數,如果讀取成功則函式返回非0值,如失敗(遇檔案結束符eof)則函式返回0值。

#include //get函式應用舉例。

using namespace std;

int main()

執行時,如果輸入:

123 abc xyz

則輸出:

123 abc xyz

當輸入「ctrl+z」及回車時,程式讀入的值是eof,程式結束。

ch=cin.get();這樣的用法並不可取,,,因為cin.get()的返回值型別是int.其中可能包含其他資訊...雖說賦值操作擷取的數值是正確的...(相容c?)

3.getline函式

getline函式常用的的呼叫形式為: 

cin.getline(字元陣列,字元個數n,終止標誌字元)

//注意:只讀取 n-1個字元 ,因為要有乙個字串終止符'\0'

cin.getline(字元指標,字元個數n,終止標誌字元)

功能: 從輸入流讀取n-1個字元,賦給指定的字元陣列(或字元指標指向的陣列),然後插入乙個字串結束標誌『\0』。

如果在讀取n-1個字元之前遇到指定的終止字元,則提前結束讀取,然後插入乙個字串結束標誌'\0'。

例子 用getline函式讀入一行字元。

#includeusing namespace std;

int main()

看輸入輸出結果:

enter string one:once upon a time

string one: once upon a time

enter string two: string two:

now try again...

enter string one: once upon a time

string one: once upon a time

enter string two: there was a

string two: there was a

3 兩個比較有用的函式:peek(), putback() 和 ignore()

cin.peek(ch); 忽略字元ch

cin.putback(ch); 把當前讀到的字元替換為ch

cin.ignore(num, ch); 從當前字元開始忽略num個字元,或是碰到ch字元開始,並且把ch字元丟丟掉。

#include

using namespace std;

int main()

return 0;

}輸入輸出結果:

enter a phrase: now!is#the!time#for!fun#!

now$isthe$timefor$fun$

4 cout.put() cout.write()

與輸入相同,cout.put(ch) 返回乙個iosream物件,因此可以連續使用

cout.write(text,num) 輸出text中的num個字元,如果num > strlen(text), 則後面輸出的是text之後的記憶體中的隨機的字元。

#include

#include

using namespace std;

int main()

輸入結果:

one if by land

one if by

one if by land i?!

1 超出資料型別指定長度的賦值

(1)無符號資料型別

unsigned char ch1= 336;

unsigned char ch2 = -1;

上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的:允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。

cout<::const_iterator 和 const vector::iterator

看下面兩個例子,就能明白二者的區別

for (vector::const_iterator iter = text.begin();

iter != text.end(); ++ iter)

*iter = " "; // error: *iter is const

vector::const_iterator iter 允許自身變化,但不允許修改它下面指向的資料,即指向的內容是常量

vectornums(10); // nums is non const

const vector::iterator cit = nums.begin();

*cit = 1; // ok:cit can change its underlying element

++cit; // error: can't change the value of cit

const vector::iterator cit 允許修改它指向的下面的資料,不允許自身的變化,即本身是個常量

7 typedef string *pstring

const pstring cstr; 解釋這個宣告的意思?

相信大部分人是這麼理解的,typedef string *pstring 是定義了乙個指向string 的指標型別,因此const pstring cstr <=> const string * cstr

即 指向乙個const string的指標,但是這是錯誤的。

正確的解釋應該是, cstr是乙個const指標,指向string型別的字串

C 容易忽略的輸入輸出特性

1 cin cout cin.get cin.get ch 的返回值 1 cin cout 就不用多說了還是返回乙個iostream物件,因此它們可以這麼使用。cin var1 var2 var3 cout var1 var2 cin.get 沒有引數時,返回值是乙個整數,所以通常這麼用 while...

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...