1.scanf與getchar
一般情況下,比如在沒有格式控制符的情況下,scanf是不能清除緩衝區的內容也就是說當遇到enter,space,tab鍵結束的時候,這3個鍵會放到緩衝區中。
同樣,getchar也不能吃掉緩衝區中的內容,但是一般在有些程式用getchar做讀入字元來暫停程式,不過如果之前緩衝區中有其他內容的話,會被getchar()讀進去,可以用fflush(stdin)來清除緩衝區中的內容(這個自己還沒試過)。同樣getchar是以enter作為結束符的,它可以讀入space,tab。
2.scanf與gets
二者都可以用來讀取字串,但是scanf讀入時是以enter,space,tab結束,同樣緩衝區中的東西不過被吃掉(不用格式控制符),而gets可以讀入space和tab鍵 如
#include
int main()
程式的功能是讀入乙個字串輸出,在讀入乙個字串輸出。可我們會發現輸入的字串中不能出現空格,例如:
測試一輸入:
hello world!
輸出:hello
world!
【分析】到此程式執行完畢,不會執行第二次的讀取操作!第一次輸入hello world!後,字串hello world!都會被讀到輸入緩衝區中,而scanf()函式取資料是遇到回車、空格、tab就會停止,也就是第乙個scanf()會取出"hello",而"world!"還在緩衝區中,這樣第二個scanf會直接取出這些資料,而不會等待從終端輸入
測試二:
hello[enter]
hello[
輸出]world[enter]
world[輸出]
【分析】程式執行了兩次從鍵盤讀入字串,說明第一次輸入結束時的回車符被丟棄!即:scanf()讀取字串會捨棄最後的回車符!sacnf會把最後的結束符吃掉但是不會吃掉緩衝區的內容。
3.scanf讀入時格式控制符
scanf("%d[^/n]",n)這個格式的話是sacnf讀入時,當遇到控制符/n也就是會車的時候才會停止,這裡可能牽扯到過載部分,還不是很清楚。
4.cin和cout
現在感覺cin和cout實在是很強大,因為它不用像scanf一樣有一定的格式,並且在讀入資料時不需要%d,%s一樣按照一定的格式。而且cin中還包含了很多像cin.get,cin.getline,cin>>等
cin感覺和sacnf差不多,他們都是遇到enter,space,tab鍵時停止讀入,但是他們會丟棄緩衝區中的內容。
#include
using namespace std;
int main ()
測試一輸入:
a[enter]
b[enter]
輸出:a b
測試二輸入;
a b[enter]
輸出;a b
同樣對於字串
#include
using namespce std;
int main ()
測試一輸入:
abcd[enter]
efgh[enter]
輸出:abcd
efgh
【分析】遇到回車結束符停止,正常
測試二輸入:
abcd efgh[enter]
輸出:abcd
efgh
【分析】第一次讀取字串時遇到空格則停止了,將abcd讀入str1,並捨棄了空格,將後面的字串給了第二個字串。這證明了cin讀入資料遇到空格結束;並且丟棄空格符;緩衝區有殘留資料室,讀入操作直接從緩衝區中取資料。
5. cin.get與cin.getline
該函式有三種格式:無參,一引數,二引數
即cin.get(), cin.get(char ch), cin.get(array_name, arsize)
讀取字元的情況:
輸入結束條件:enter鍵
對結束符處理:不丟棄緩衝區中的enter
cin.get()
與 cin.get(char ch)用於讀取字元,他們的使用是相似的,
即:ch=cin.get() 與 cin.get(ch)是等價的。
#include
using namespace std;
int main()
測試一輸入:
a[enter]
輸出:a
97 10
【分析】會發現只執行了一次從鍵盤輸入,顯然第乙個字元變數取的'a', 第二個變數取的是enter(ascii值為10),這是因為該函式不丟棄上次輸入結束時的enter字元,所以第一次輸入結束時緩衝區中殘留的是上次輸入結束時的enter字元!
測試二輸入:
a b[enter]
輸出:a
97 32
【分析】顯然第乙個字元變數取的'a', 第二個變數取的是space(ascii值為32)。原因同上,沒有丟棄space字元。
讀取字串的情況:
cin.get(array_name, arsize)
是用來讀取字串的,可以接受空格字元,遇到enter結束輸入,按照長度(arsize)讀取字元, 會丟棄最後的enter字元。
#include
using namespace std;
int main ()
測試一輸入:
abc def[enter]
輸出:abc def
【分析】說明該函式輸入字串時可以接受空格。
測試二輸入:
1234567890[enter]
輸出:123456789
【分析】輸入超長,則按需要的長度取資料。
程式7:
#include
using namespace std;
int main ()
測試一輸入:
12345[enter]
輸出:1234 53
【分析】第一次輸入超長,字串按長度取了"1234",而'5'仍殘留在緩衝區中,所以第二次輸入字元沒有從鍵盤讀入,而是直接取了'5',所以列印的ascii值是53('5'的ascii值)。
測試二輸入:
1234[enter]
a[enter]
輸出:1234 97
【分析】第二次輸入有效,說明該函式把第一次輸入後的enter丟棄了!
getline()
cin.getline()
與 cin.get(array_name, arsize)的讀取方式差不多,以enter結束,可以接受空格字元。按照長度(arsize)讀取字元, 會丟棄最後的enter字元。
但是這兩個函式是有區別的:
cin.get(array_name, arsize)
當輸入的字串超長時,不會引起cin函式的錯誤,後面的cin操作會繼續執行,只是直接從緩衝區中取資料。但是cin.getline()當輸入超長時,會引起cin函式的錯誤,後面的cin操作將不再執行。(具體原因將在下一部分"cin的錯誤處理"中詳細介紹)
#include
using namespace std;
int main ()
測試輸入:
12345[enter]
輸出:1234
-52【分析】與cin.get(array_name, arsize)的例程比較會發現,這裡的ch並沒有讀取緩衝區中的5,而是返回了-52,這裡其實cin>>ch語句沒有執行,是因為cin出錯了!
C C 輸入 輸出
在c語言中,我們的輸入輸出靠的是標準庫函式,最常用的就是 scanf 和 printf 這一對了。那麼c 又是怎麼樣實現輸入輸出的呢?下面來寫c 的第乙個程式!include using namespace std int main 不難看出,它有以下特徵 1.使用cout標準輸出 控制台 和cin...
C C 輸入輸出
符號 描述 h0 short型的八進位制 0int型的八進位制 l0long型的八進位制 hdshort型的十進位制 dint型的十進位制 ldlong型的十進位制 hx,hx short型的十六進製制,x表示小寫,x表示大寫 x,x int型的十六進製制,x表示小寫,x表示大寫 lx,lx lon...
C C 輸入輸出
使用printf 函式和scanf 函式,要宣告標頭檔案 include 1.printf 函式 形式 printf 格式控制字串 輸出表列 功能 通過標準輸出裝置 如顯示器 輸出一組資料,輸出形式由 格式控制 字串規定。例如 printf 4d,4d a,b 2.scanf 函式 功能 從終端輸入...