C語言輸入輸出用法總結

2021-10-03 07:50:09 字數 4008 閱讀 4436

二、輸入

三、關於緩衝區的一些總結

名稱用法

putchar()

只能輸出單個字元

puts()

只能輸出字串,並且輸出結束後會自動換行

printf()

可以輸出各種型別的資料

對於printf()函式的格式控制符完整形式如下:

%[flag][width][.precision]type

tpye表示輸出型別,比如 %d、%f、%c、%lf,type 就分別對應 d、f、c、lf;再如,%-9d中 type 對應 d。

type 這一項必須有,這意味著輸出時必須要知道是什麼型別。

彙總一下常見的格式控制符:

格式控制符

說明%c

輸出乙個單一的字元

%hd、%d、%ld

以十進位制、有符號的形式輸出 short、int、long 型別的整數

%hu、%u、%lu

以十進位制、無符號的形式輸出 short、int、long 型別的整數

%ho、%o、%lo

以八進位制、不帶字首、無符號的形式輸出 short、int、long 型別的整數

%#ho、%#o、%#lo

以八進位制、帶字首、無符號的形式輸出 short、int、long 型別的整數

%hx、%x、%lx;%hx、%x、%lx

以十六進製制、不帶字首、無符號的形式輸出 short、int、long 型別的整數。如果 x 小寫,那麼輸出的十六進製制數字也小寫;如果 x 大寫,那麼輸出的十六進製制數字也大寫。

%#hx、%#x、%#lx;%#hx、%#x、%#lx

以十六進製制、帶字首、無符號的形式輸出 short、int、long 型別的整數。如果 x 小寫,那麼輸出的十六進製制數字和字首都小寫;如果 x 大寫,那麼輸出的十六進製制數字和字首都大寫。

%f、%lf

以十進位制的形式輸出 float、double 型別的小數

%e、%le;%e、%le

以指數的形式輸出 float、double 型別的小數。如果 e 小寫,那麼輸出結果中的 e 也小寫;如果 e 大寫,那麼輸出結果中的 e 也大寫。

%g、%lg;%g、%lg

以十進位制和指數中較短的形式輸出 float、double 型別的小數,並且小數部分的最後不會新增多餘的 0。如果 g 小寫,那麼當以指數形式輸出時 e 也小寫;如果 g 大寫,那麼當以指數形式輸出時 e 也大寫。

%s輸出乙個字元

%p、%p

以十六進製制的形式輸出資料的位址。p的大小寫決定了十六進製制字首的大小寫形式。(這裡的位址都是虛擬位址,不等於資料在記憶體中的實體地址)

注意:

width表示最小輸出寬度,也就是至少占用幾個字元的位置;

當輸出結果的寬度不足 width 時,以空格補齊(如果沒有指定對齊方式,缺省會在左邊補齊空格);當輸出結果的寬度超過 width 時,width 不再起作用,按照資料本身的寬度來輸出。

.precision 表示輸出精度,也就是小數的位數

另外,.precision 也可以用於整數和字串,但是功能卻是相反的:

flag 是標誌字元。例如,%#x中 flag 對應 #,%-9d中 flags 對應-。下表列出了 printf() 可以用的 flag:

標誌字元含義-

-表示左對齊。如果沒有,就按照預設的對齊方式,預設一般為右對齊

+用於整數或者小數,表示輸出符號(正負號)。如果沒有,那麼只有負數才會輸出符號

空格用於整數或者小數,輸出值為正時冠以空格,為負時冠以負號

#對於八進位制(%o)和十六進製制(%x / %x)整數,# 表示在輸出時新增字首;八進位制的字首是 0,十六進製制的字首是 0x / 0x。對於小數(%f / %e / %g),# 表示強迫輸出小數點。如果沒有小數部分,預設是不輸出小數點的,加上 # 以後,即使沒有小數部分也會帶上小數點

名稱用法

getchar()、getche()、getch()

這三個函式都用於輸入單個字元

gets()

獲取一行資料,並作為字串處理

scanf()

可以輸入多種型別的資料

函式作用

緩衝區標頭檔案

回顯適用平台

getchar()

獲取乙個字元(需要回車)

有stdio.h

有windows、linux、mac os 等所有平台

getche()

獲取乙個字元(無需回車)

無conio.h

有windows

getch()

獲取乙個字元(無需回車)

無conio.h

無windows

get函式:獲取字串。gets() 是有緩衝區的,每次按下回車鍵,就代表當前輸入結束了。

gets() 和 scanf() 的主要區別是:

故對於輸入一串字串,若字串中包含有空格,則需要使用gets()函式才能正確輸入。

scanf函式,格式控制符與printf函式相差無幾。只是scanf沒有了%p位址輸出控制符號。

&稱為取位址符,也就是獲取變數在記憶體中的位址。

scanf() 控制字串的完整寫法為:

% type

其中, 表示可有可無。各個部分的具體含義是:

重點:匹配特定字元 %[***]

使用連字元 -

常用的連字元舉例:

你也可以將它們合併起來,例如:

不匹配某些字元

scanf() 允許我們在%[ ]中直接指定某些不能匹配的字元,具體方法就是在不匹配的字元前面加上^。例如:

使用 scanf() 清空緩衝區的方案,就是:

scanf("%*[^\n]"); scanf("%*c");
下面我們就來解釋一下。

首先需要明白的是,等到需要清空緩衝區的時候,緩衝區中的最後乙個字元一定是換行符\n,因為輸入緩衝區是行緩衝模式,使用者按下回車鍵會產生換行符,結束本次輸入,然後輸入函式開始讀取。

scanf("%*[^\n]");將換行符前面的所有字元清空,scanf("%*c");將最後剩下的換行符清空。

scanf函式從緩衝區讀取資料時的一些特性

當遇到 scanf() 函式時,程式會先檢查輸入緩衝區中是否有資料:

注意:緩衝區(buffer)又稱為快取(cache),是記憶體空間的一部分。緩衝區是為了讓低速的輸入輸出裝置和高速的使用者程式能夠協調工作,並降低輸入輸出裝置的讀寫次數。

根據不同的標準,緩衝區可以有不同的分類。

1)全緩衝

在這種情況下,當緩衝區被填滿以後才進行真正的輸入輸出操作。緩衝區的大小都有限制的,比如 1kb、4mb 等,資料量達到最大值時就清空緩衝區。

在實際開發中,將資料寫入檔案後,開啟檔案並不能立即看到內容,只有清空緩衝區,或者關閉檔案,或者關閉程式後,才能在檔案中看到內容。這種現象,就是緩衝區在作怪。

2)行緩衝

在這種情況下,當在輸入或者輸出的過程中遇到換行符時,才執行真正的輸入輸出操作。行緩衝的典型代表就是標準輸入裝置(也即鍵盤)和標準輸出裝置(也即顯示器)。

linux和macos系統中printf和scanf函式都具有行緩衝區。

3)不帶緩衝

不帶緩衝區,資料就沒有地方快取,必須立即進行輸入輸出。

getche()、getch() 就不帶緩衝區,輸入乙個字元後立即就執行了,根本不用按下回車鍵。

windows 下的 printf() 也不帶緩衝區,不管最後有沒有換行符\n,都會立即輸出,所以對於類似的輸出**,windows 和 linux、mac os 會有不同的表現。

錯誤資訊輸出函式 perror() 也沒有緩衝區。錯誤資訊必須刻不容緩、立即、馬上顯示出來,緩衝區將會增加捕獲錯誤的時間,這是毫無理由的。

總結

所謂重新整理緩衝區,就是將緩衝區中的內容送達到目的地。緩衝區的重新整理遵循以下的規則:

C語言檔案輸入輸出總結

檔案輸入輸出 1 fopen include file fopen const char fname,const char mode mode方式 r 開啟乙個檔案,可以讀取檔案。w 開啟乙個檔案,可以寫入檔案,先將檔案的長度截為零。如果該檔案不存在則先建立之。a 開啟乙個檔案,可以寫入檔案,向已有...

C語言的輸入輸出總結

putchar 把變數中的乙個字元常量輸出到顯示器螢幕上 getchar 從鍵盤上輸入乙個字元常量,此常量就是該函式的值 printf 把鍵盤中的各類資料,加以格式控制輸出到顯示器螢幕上 scanf 從鍵盤上輸入各類資料,並存放到程式變數中 puts 把陣列變數中的乙個字串常量輸出到顯示器螢幕上 g...

C語言 輸入輸出相關總結

複習c語言,將以前對輸入輸出的總結筆記轉到網上,以便以後查閱。其中一些例子是取自印度大佬編寫的名為c語言教程,解決了許多疑惑。不得不說印度編寫的教 的棒。getchar 可以接受鍵入的任何值,包括製表符和回車鍵 int main int argc,char ar int main int argc,...