C語言標准庫概述
1)庫函數分類
我們暫時需要記住的有:
標准輸入輸出函數庫:stdio
數學應用函數庫:math
字符串處理函數庫:string
2)調用函數庫時,我們需要預編譯指令:
即:
//或者
#include"頭文件名"
需要注意的是,第一種寫法,一般在使用標准函數庫時使用,第二種寫法,一般在使用用戶自己定義的函數庫時使用。
格式輸出函數:printf
1)前言:
從計算機向外部設備輸出信息稱為輸出,即將計算機內的信息以打印或者存儲的形式轉到終端。
printf函數在<stdio.h>函數庫中
預編譯指令為:#include<stdio.h>
2)標准格式輸出:
printf("格式輸出控制表列",輸出參數表列);
格式輸出控制表列包括普通字符和格式字符組成,普通字符如:hello,world;
格式字符以%開頭,后跟一個字符表示數據類型。如:%d,%f等。
輸出參數表列在控制表列中如果沒有格式字符,可以省略:如:printf("Hello,world!");
這里,我們給出兩個實例幫助理解:
printf("Hello,world!");
printf("%d",100);
printf("521%d!",1314);
3)格式控制符
在明白輸出函數的基本使用方法后,我們剖析一下格式控制符。
1、%d格式
標准輸出函數中以%作為格式輸出控制索引。%d是以十進制在屏幕上顯示輸出參數表列的值。當然輸出參數表列可以為字符型,整型,浮點型等類型,不過最終都以10進制輸出。我們看一個例子:
main()
{
char c='A';
int a=1,b=2;
printf("c=%d,a/b=%d,b/a=%d,(float)a/b=%d",c,a/b,b/a,(float)a/b);
printf("123.456=%d",123.456);
printf("%d");
reeturn 0;
}
最終的輸出結果出乎我們意料,
c=65,a/b=0,b/a=2,(float)a/b=0
123.45=446676599
2367460
我們在這里解釋一下,首先字符型的'A'在ASICC中的數值是65,所以最終以十進制輸出的是65;由於,a/b的值理應為0.5,在這里,由於是整型輸出,所以小數部分被截斷,最終的結果為0,同理,我們不難理解最后的(float)是什么情況,那么b/a的結果顯然是2,我們不在闡述。下一個輸出,123.456是float類型,不過在C語言中,所有的浮點型都按照double型計算,%d輸出常量123.456在內存中低4字節數據,所以最后結果是446676599,這似乎有點歐亨利結局了,出乎意料卻又在情理之中。最后一個輸出,由於沒有輸出參數表列,所以會輸出一個任意值。
2、%ld格式
毫無疑問,%ld中的l是long的簡寫,所以%ld是用來長整型類型輸出的,不過值得注意的是,在32位的操作系統中,int和long型都分配四個字節存儲空間,所以使用%d,%ld無本質區別。
3、%u格式
%u用來輸出無符號整型類型,定義為:unsigned int a;
其中,引入無符號整型的意義就是用在無負數的場景中,以增大int存儲范圍。
printf("%d",-1);
printf("%u",-1);
在這個程序中,我們得到的結果是不同的,第一個輸出為-1,第二個輸出為4294967295
解釋一下第二個奇怪的結果,由於負數在計算機內部以補碼形式存在,-1的補碼為0xffffffff,所以在轉換為無符號整型時,符號位被當做數值操作,最終輸出的結果為0xffffffff,換算成十進制為4294967295
4、%c格式
%c格式中的c為char類型,所以控制輸出字符型,值得注意的是,在其他類型轉換為char型時,我們關注的該類型的二進制代碼的低八位所代表的的數值(char代表的為0-255)。
//那如果是負數呢?
printf("%c,%c",-159,97);
通過運行,我們可以發現,兩個輸出的結果都為c,那這是為什么呢?
我們不妨分析一下-159,和97的區別,發現97+159=256.根據負數在計算機內部存儲的為補碼,我們通過補碼的實質可以發現,-159的補碼等於256對159取余,我們得到了97,由於我們取得是低八位數值,所以自然而然輸出結果為相同的c。
我們給出以下證明:
[-159]原碼=1000 0000 0000 0000 0000 0000 1001 1111
[-159]反碼=1111 1111 1111 1111 1111 1111 0110 0000
[-159]補碼=1111 1111 1111 1111 1111 1111 0110 0001
[97]補碼=0000 0000 0000 0000 0000 0000 0110 0001
於是,去低八位的值是相同的。
5、%f格式
%f格式以浮點型輸出,主要用於輸出float和double型,默認輸出小數點后6位數字,不夠6位補零輸出,例如:
printf("%f,%f",123.456,789);
//輸出結果為:123.456000,0.000000;
什么?又被震驚到了,789為什么變成了0.000000?這不柯學,我們分析一下,789在內存中以補碼存在,
其值為:
[789]補碼=0000 0000 0000 0000 0000 0011 0001 0101
由於%f以單精度輸出,所以,最高位為符號位,低23位為位數位,中間8位為指數位,所以內存中的數值構成浮點數0.00000000000001100010101*2^0
加上輸出為7位有效數字,所以最終結果為0.000000,也就不奇怪了。
6、%e格式
%e格式以指數形式輸出,指數形式由數符,數值,字符,階符和階碼構成。
| 正數 | 負數 |
|---|---|
| 數值E 階符 階碼 | 數符 數值E 階符 階碼 |
其中,數符用來表示數據的正負,我們在書寫時,需要注意一下格式:
(+/-)[數字]e(+/-)[數字]的格式書寫
1e+2,-1e+2,1e-1……
關於指數和float類型,我們后面補充相關指數。
7、%s格式
%s格式用來輸出字符串,我們需要注意的有,在輸出時,如果字符串中有轉義字符,會執行這些轉義字符,而%c不會這樣。
printf("%s","Hello\nwor\0ld");
/*輸出結果:Hello
wor
*/
8、%o,%x格式,%和\輸出
這兩個格式不常用,但是我們仍然需要注意,%o以八進制輸出,%x以十六進制輸出.
而%和\作為控制符,如果我們需要輸出這兩個字符,我們需要在前面重寫一遍該字符
例如:printf("%%=%d",123);
4)格式輸出控制字符
1、%md,%-md,%mc,%-mc格式
對於這里的m,我們解釋為控制位寬輸出,即用於按指定的寬度m以相應格式輸出數據,其特點如下:
如果數據位寬大於m,則按實際寬度輸出,如果輸出數據寬度小於m,則左補空格,共輸出m列。
而‘-’號代表如果數據位寬大於m,則按實際寬度輸出,如果輸出數據寬度小於m,則右補空格,共輸出m列。
2、%mf,%-mf,%.nf,%m.nf,%-m.nf格式
對於這里的前兩個與第一種格式相似,我們不在闡述。
而后面的幾個格式控制表示為:
%.nf指定小數點后的輸出寬度,當n大於數據有效位數時,右邊補零,當n小於有效位數時,采取四舍五入規則。
%m.nf,m用於指定整數和小數的總位寬,m大於輸出寬度時,左補空格,m小於輸出寬度時,按實際寬度輸出,n用於指定小數點后的寬度,如果n大於有效寬度,右補零,n小於有效寬度時,按四舍五入規則截取
我們需要注意的有:我們應首先考慮n的值,即在滿足n的值得基礎上在判斷m對數據輸出的影響,當m小於等於n是,m對輸出數據不起作用,我們舉一個栗子:
printf("%6.2f,%5.3f,%8.4f",1.234,19.87654,100000.23);
/*輸出結果為:
_ _ 1.23,19.877,100000.2300
*/
加上負號代表左對齊.
格式輸入函數
前言:從輸入設備向計算機輸入數據稱為輸入,我們用標准輸入函數scanf完成。
格式:一般格式為:scanf("格式輸入控制表列",輸入參數地址表列);
需要注意的是我們在輸入參數地址表列中書寫的是變量的地址,我們需要使用取地址符完成上述操作.
eg:scanf("%d",&x);
scanf的格式控制字符與printf的相似,這里不再一一展開,不過,我們需要闡述一個事實,scanf會產生“歷史遺留問題”;
scanf("%d",&x);
scanf("%c",&c);
printf("%d",c);
當我們按下回車時,c中是有值得,大家猜一下輸出多少。
為了避免這種問題,我們常常使用getchar()來消除scanf的遺留問題。
我們列出一些容易出錯的點:
1)在讀取字符串時,會在字符串末尾自動添加'\0',所以存儲字符串的字符數組的長度應該為:max(max_strlen_str)+1;
2)在讀取字符串時,我們不需要添加&,因為字符串的名字本身就是地址常量,后面會有說明。
3)使用scanf()時,應該遵循寫什么輸入什么的原則,即如果格式輸入控制列表中有空格,那么在讀入數據時應該加上空格,防止讀入錯誤的數據,導致程序報錯。
字符輸入輸出函數
前言:在stdio庫中,還有兩個字符輸入輸出函數,即getchar和putchar函數。
putchar的作用是向終端輸出一個字符,其一般格式為:pruchar(c);
這里我們列出一些putchar的常見用法:
1)輸出字符,可以為變量也可以是常量
2)可以輸出轉義字符
3)自動將ASICC碼轉換為字符型輸出
getchar()的作用是從標准輸入設備中獲取一個字符,
一般格式為:c=getchar();
