十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
你會發(fā)現(xiàn),有一些頭文件(比如stdlib.h,stdio.h)每一個編譯器都有,而里面的函數(shù)(如printf,malloc)每一個編譯器都支持。這些函數(shù)組成的集合就是標準函數(shù)庫。平常用的函數(shù)基本都屬于標準函數(shù)庫。
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的梁平網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
ANSI對此是有規(guī)定的
在?C語言程序設計里,C 標準函數(shù)庫(C Standard library) ?是所有符合標準的頭文件(head file)的集合,以及常用的函數(shù)庫實現(xiàn)程序,例如I/O 輸入輸出和字符串控制。不像?COBOL、Fortran?和?PL/I等編程語言,在 C 語言的工作任務里不會包含嵌入的關(guān)鍵字,所以幾乎所有的 C 語言程序都是由標準函數(shù)庫的函數(shù)來創(chuàng)建的。
每一個函數(shù)的名稱與特性會被寫成一個電腦文件,這個文件就稱為頭文件,但是實際的函數(shù)實現(xiàn)是被分存到函數(shù)庫文件里。頭文件的命名和領(lǐng)域是很常見的,但是函數(shù)庫的組織架構(gòu)也會因為不同的編譯器而有所不同。標準函數(shù)庫通常會隨附在編譯器上。因為 C 編譯器常會提供一些額外的非?ANSI C?函數(shù)功能,所以某個隨附在特定編譯器上的標準函數(shù)庫,對其他不同的編譯器來說,是不兼容的。
C語言輸入輸出函數(shù)有很多,標準I/O函數(shù)中包含了如下幾個常用的函數(shù):
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
int getc(FILE *fp)
getc主要是從文件中讀出一個字符.常用的判斷文件是否讀取結(jié)束的語句為 (ch = getc(fp)) != EOF.EOF為文件結(jié)束標志,定義在stdio.h中,就像EXIT_SUCCESS,EXIT_FAILURE定義在stdlib.h中一樣,文件也可以被理解為一種流,所以當fp為stdin時,getc(stdin)就等同于getchar()了.
int putc(int ch,FILE *fp)
putc主要是把字符ch寫到文件fp中去.如果fp為stdout,則putc就等同于putchar()了.
int getchar(void)
getchar主要是從標準輸入流讀取一個字符.默認的標準輸入流即stdio.h中定義的stdin.但是從輸入流中讀取字符時又涉及到緩沖的問題,所以并不是在屏幕中敲上一個字符程序就會運行,一般是通過在屏幕上敲上回車鍵,然后將回車前的字符串放在緩沖區(qū)中,getchar就是在緩沖區(qū)中一個一個的讀字符.當然也可以在while循環(huán)中指定終止字符,如下面的語句:while ((c = getchar()) != '#')這是以#來結(jié)束的.
int putchar(int ch)
putchar(ch)主要是把字符ch寫到標準流stdout中去.
char * gets(char *str)
gets主要是從標準輸入流讀取字符串并回顯,讀到換行符時退出,并會將換行符省去.
int puts(char *str)
puts主要是把字符串str寫到標準流stdout中去,并會在輸出到最后時添加一個換行符.
char *fgets(char *str, int num, FILE *fp)
str是存放讀入的字符數(shù)組指針,num是最大允許的讀入字符數(shù),fp是文件指針.fgets的功能是讀一行字符,該行的字符數(shù)不大于num-1.因為fgets函數(shù)會在末尾加上一個空字符以構(gòu)成一個字符串.另外fgets在讀取到換行符后不會將其省略.
int fputs(char *str, file *fp)
fputs將str寫入fp.fputs與puts的不同之處是fputs在打印時并不添加換行符.
int fgetc(FILE *fp)
fgetc從fp的當前位置讀取一個字符.
int fputc(int ch, file *fp)
fputc是將ch寫入fp當前指定位置.
int fscanf(FILE *fp, char *format, 輸入列表)
fscanf按照指定格式從文件中出讀出數(shù)據(jù),并賦值到參數(shù)列表中.
int fprintf(FILE *fp, char *format, 輸出列表)
fprintf將格式化數(shù)據(jù)寫入流式文件中.
數(shù)據(jù)塊讀寫函數(shù)
fread (buffer,size,count,fp);
fwrite(buffer,size,count,fp);
參數(shù)說明:
buffer:是一個指針。
對fread 來說,它是讀入數(shù)據(jù)的存放地址。
對fwrite來說,是要輸出數(shù)據(jù)的地址(均指起始地址)。
size: 要讀寫的字節(jié)數(shù)。
count: 要進行讀寫多少個size字節(jié)的數(shù)據(jù)項。
fp: 文件型指針。
C語言,是一種通用的、過程式的編程語言,廣泛用于系統(tǒng)與應用軟件的開發(fā)。具有高效、靈活、功能豐富、表達力強和較高的移植性等特點,在程序員中備受青睞。
C語言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·湯普遜(Ken Thompson)所研制出的B語言的基礎(chǔ)上發(fā)展和完善起來的。目前,C語言編譯器普遍存在于各種不同的操作系統(tǒng)中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C語言的設計影響了許多后來的編程語言,例如C++、Objective-C、Java、C#等。
后來于1980年代,為了避免各開發(fā)廠商用的C語言語法產(chǎn)生差異,由美國國家標準局(American National Standard Institution)為C語言訂定了一套完整的國際標準語法,稱為ANSI C,作為C語言的標準。1980年代至今的有關(guān)程序開發(fā)工具,一般都支持符合ANSI C的語法。
C語言是一個程序語言,設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。C語言也很適合搭配匯編語言來使用。盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規(guī)格寫出的C語言程序可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業(yè)平臺。
早期發(fā)展
C語言最早是由丹尼斯·里奇為了在PDP-11電腦上運行的UNIX系統(tǒng)所設計出來的編程語言,第一次發(fā)展在1969年到1973年之間。之所以被稱為“C”是因為C語言的很多特性是由一種更早的被稱為B語言的編程語言中發(fā)展而來。早期操作系統(tǒng)的核心大多由匯編語言組成,隨著C語言的發(fā)展,C語言已經(jīng)可以用來編寫操作系統(tǒng)的核心。1973年,Unix操作系統(tǒng)的核心正式用C語言改寫,這是C語言第一次應用在操作系統(tǒng)的核心編寫上。
KR C
1978年,丹尼斯·里奇(Dennis Ritchie)和布萊恩·柯林漢(Brian Kernighan)合作出版了《C程序設計語言》的第一版。書中介紹的C語言標準也被C語言程序員稱作“KR C”,第二版的書中也包含了一些ANSI C的標準。KR C主要介紹了以下特色:
結(jié)構(gòu)(struct)類型
長整數(shù)(long int)類型
無符號整數(shù)(unsigned int)類型
把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道用戶要處理i = -10還是i =- 10,使得處理上產(chǎn)生混淆。
即使在后來ANSI C標準被提出的許多年后,KR C仍然是許多編譯器的最低標準要求,許多老舊的編譯仍然運行KR C的標準。
ANSI C 和 ISO C
1989年,C語言被 ANSI 標準化(ANSI X3.159-1989)。標準化的一個目的是擴展KR C。這個標準包括了一些新特性。在KR出版后,一些新特性被非官方地加到C語言中。
void 函數(shù)
函數(shù)返回 struct 或 union 類型
void * 數(shù)據(jù)類型
在ANSI標準化自己的過程中,一些新的特性被加了進去。ANSI也規(guī)定了一套標準函數(shù)庫。ANSI ISO(國際標準化組織)成立 ISO/IEC JTC1/SC22/WG14 工作組,來規(guī)定國際標準的C語言。通過對ANSI標準的少量修改,最終通過了 ISO 9899:1990。隨后,ISO標準被 ANSI 采納。
傳統(tǒng)C語言到ANSI/ISO標準C語言的改進包括:
增加了真正的標準庫
新的預處理命令與特性
函數(shù)原型允許在函數(shù)申明中指定參數(shù)類型
一些新的關(guān)鍵字,包括 const、volatile 與 signed
寬字符、寬字符串與字節(jié)多字符
對約定規(guī)則、聲明和類型檢查的許多小改動與澄清
WG14工作小組之后又于1995年,對1985年頒布的標準做了兩處技術(shù)修訂(缺陷修復)和一個補充(擴展)。下面是 1995 年做出的所有修改:
3 個新的標準庫頭文件 iso646.h、wctype.h 和 wchar.h
幾個新的記號與預定義宏,用于對國際化提供更好的支持
printf/sprintf 函數(shù)一系列新的格式代碼
大量的函數(shù)和一些類型與常量,用于多字節(jié)字符和寬字節(jié)字符
C99在ANSI的標準確立后,C語言的規(guī)范在一段時間內(nèi)沒有大的變動,然而C++在自己的標準化創(chuàng)建過程中繼續(xù)發(fā)展壯大。《標準修正案一》在1995年為C語言創(chuàng)建了一個新標準,但是只修正了一些C89標準中的細節(jié)和增加更多更廣的國際字符集支持。不過,這個標準引出了1999年ISO 9899:1999的發(fā)表。它通常被稱為C99。C99被ANSI于2000年3月采用。
在C99中包括的特性有:
增加了對編譯器的限制,比如源程序每行要求至少支持到 4095 字節(jié),變量名函數(shù)名的要求支持到 63 字節(jié)(extern 要求支持到 31)。
增強了預處理功能。例如:
宏支持取可變參數(shù) #define Macro(...) __VA_ARGS__
使用宏的時候,允許省略參數(shù),被省略的參數(shù)會被擴展成空串。
支持 // 開頭的單行注釋(這個特性實際上在C89的很多編譯器上已經(jīng)被支持了)
增加了新關(guān)鍵字 restrict, inline, _Complex, _Imaginary, _Bool
支持 long long, long double _Complex, float _Complex 等類型
支持不定長的數(shù)組,即數(shù)組長度可以在運行時決定,比如利用變量作為數(shù)組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現(xiàn),不定長數(shù)組不能用在全局,或 struct 與 union 里。
變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i100;++i) 的形式,即i 只在 for 語句塊內(nèi)部有效。
允許采用(type_name){xx,xx,xx} 類似于 C++ 的構(gòu)造函數(shù)的形式構(gòu)造匿名的結(jié)構(gòu)體。
初始化結(jié)構(gòu)的時候允許對特定的元素賦值,形式為:
struct {int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
struct {int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5} // 3,4 是對 .c,.d 賦值的
格式化字符串中,利用 \u 支持 unicode 的字符。
支持 16 進制的浮點數(shù)的描述。
printf scanf 的格式化串增加了對 long long int 類型的支持。
浮點數(shù)的內(nèi)部數(shù)據(jù)描述支持了新標準,可以使用 #pragma 編譯器指令指定。
除了已有的 __line__ __file__ 以外,增加了 __func__ 得到當前的函數(shù)名。
允許編譯器化簡非常數(shù)的表達式。
修改了 / % 處理負數(shù)時的定義,這樣可以給出明確的結(jié)果,例如在C89中-22 / 7 = -3, -22 % 7 = -1 ,也可以-22 / 7= -4, -22 % 7 = 6。 而C99中明確為 -22 / 7 = -3, -22 % 7 = -1,只有一種結(jié)果。
取消了函數(shù)返回類型默認為 int 的規(guī)定。
允許 struct 定義的最后一個數(shù)組不指定其長度,寫做 [] 。
const const int i 將被當作 const int i 處理。
增加和修改了一些標準頭文件,比如定義 bool 的 stdbool.h ,定義一些標準長度的 int 的 inttypes.h ,定義復數(shù)的 complex.h ,定義寬字符的 wctype.h ,類似于泛型的數(shù)學函數(shù) tgmath.h, 浮點數(shù)相關(guān)的 fenv.h。 在stdarg.h 增加了 va_copy 用于復制 ... 的參數(shù)。time.h 里增加了 struct tmx ,對 struct tm 做了擴展。
輸入輸出對寬字符以及長整數(shù)等做了相應的支持。