C C 中的輸入輸出

2021-05-22 17:38:44 字數 3797 閱讀 3761

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 函式 功能 從終端輸入...