緩衝流的理解

幾個C特殊的格式:

1、 scanf可以濾去一些不想要的東西。

舉例說明如下:
比如:
輸入:a = 1,b = 2;
scanf(“a = %d,b = %d”, &a, &b);
再比如:
scanf("%d %*d %d",&a, &b);
輸入1 2 3回車(系統將1賦予m,將3賦予n,因爲*號爲忽略輸入修飾符,表示跳過它相應的數據所以2不賦予任何變量)


2. 字符串輸入
getchar(), scanf(“%c”); scanf(“%s”), gets()區別

其中getchar() 和 scanf(“%c”)的功能是一樣的。
這兩個函數讀入的是輸入流中當前位置的字符,比如:
scanf(“%d”,&n);
c = getchar();
假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘\n’。
同樣,gets()也是從當前位置讀入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此時讀入字符數組中的字符串就是“\n” 了
所以通常在用scanf讀入一個非字符串的類型之後,如果要讀入字符,或字符數組,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多餘的空格的話,就用gets()讀掉。
和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作爲字符串結束的標誌。
也就是說,scanf("%s")其實是比較特殊的,它一定會等到所有空白符結束,一直等到它要等的字符串出現,它纔讀取,在字符串出現之前,出現的所有空白符都會忽略掉。


1.一些特殊字符的輸出:
單引號,雙引號,和反斜槓的輸出在前面加轉義字符”\”
如:”\’” , “\”” , “\\”
%的輸出用兩個連在一起的%%,即printf(“%%”);
2. double型 應該用%lf來輸入和輸出,否則錯誤!
3. 對64位整數的輸入輸出,
64位整數是:
__int64 (注意int前面是兩個下劃線
輸入輸出格式爲“%I64d”.
4.long long應該用"%lld"輸入輸出。
5. 正負號 
- 結果左對齊,右邊填空格 
+ 輸出符號空格輸出值爲正時冠以空格,爲負時冠以負號
6. 輸出寬度和小數點後的位數(或字符串截取長度)
%5.3lf
表示右對齊,5爲格式寬度,3爲保留小數點後3位(四捨五入)
%-7.2s
表示左對齊,7爲格式寬度,2爲截取字符串中前2個字符。
7.%g的使用,%g是自動選擇%f和%e中的一種,根據輸出的長短選擇短的那個,有一個關鍵的應用是,%g在輸出時會自動刪去double後面多餘的0,這個應用比較廣泛。
很重要的一點:千萬不要把cout和printf混用,因爲cout是帶緩衝的而printf不帶,所以會使得輸出的數據順序混亂

%d %lld %lf自動掃描前導空格
 
 
• 讀一個非空白字符,方法一
char str[2];
scanf(“%1s”, str);
// %s掃描前導空白,並且只讀一個字符
char c = str[0];
• 方法二
– 強制掃描空白
– 在%前面加上一個空格表示“強制掃描前導空白”
– scanf(“ %c”, &ch);
– 前面那個讀人物信息的完整scanf語句:
• scanf(“%s %c %s”, name, &gender, ability);
• 同理,格式後面加一空格表示“讀完這個變量後掃描空白”,注意空白是包括回車的


C++的I/O:
1.cin>> cout<< 當輸入數據量特別大時建議使用scanf ,效率會大大提升。
2.輸入含空格等的字符串時,可以使用:
cin.getline(str) 或者
getline(cin,str)
未提示輸入結束標記時 用
while(cin.getline(str)) 或者while(getline(cin,str))
3.無論用cin還是scanf ,讀入字符之後若要再繼續讀入,應消去換行符,可使用scanf("%*c")或者getchar().


發佈了44 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章