高級篇附錄二語言庫_第1頁
高級篇附錄二語言庫_第2頁
高級篇附錄二語言庫_第3頁
高級篇附錄二語言庫_第4頁
高級篇附錄二語言庫_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、上章回顧數(shù)組和指針相同與不同通過指針數(shù)組和通過數(shù)組指針指針在什么時(shí)候可以加減運(yùn)算函數(shù)指針的申明和調(diào)用函數(shù)數(shù)組和數(shù)組函數(shù)家園家園-開發(fā)板商城/上海附錄二C語言標(biāo)準(zhǔn)庫家園家園-開發(fā)板商城/上海預(yù)習(xí)檢查NULL和NUL有什么差別字符串操作有哪幾個(gè)常用函數(shù)memcpy和strcpy有什么差別家園家園-開發(fā)板商城/上海課程目標(biāo)本章概述對標(biāo)準(zhǔn)C語言的補(bǔ)充,以及一些常用的特性。本章目標(biāo)了解一些C語言特殊的宏定義掌握函數(shù)可變參數(shù)的應(yīng)用重點(diǎn)理解NULL, offsetof, errno宏或函數(shù)掌握函數(shù)可變參數(shù)列表難點(diǎn)C語言庫的日期函數(shù)操作難點(diǎn)函數(shù)的可變參數(shù)列表標(biāo)準(zhǔn)C的異常處理

2、機(jī)制家園家園-開發(fā)板商城/上海本章結(jié)構(gòu)家園家園-開發(fā)板商城/上海標(biāo)準(zhǔn)庫應(yīng)用總結(jié)主要庫文件C標(biāo)準(zhǔn)語言庫概要和應(yīng)用標(biāo)準(zhǔn)C語言函數(shù)標(biāo)準(zhǔn)語言庫概述2.1 標(biāo)準(zhǔn)語言概述函數(shù)庫簡介C語言標(biāo)準(zhǔn)庫的歷史標(biāo)準(zhǔn)庫函數(shù)優(yōu)勢環(huán)境和宿主環(huán)境家園家園-開發(fā)板商城/上海2.1.1 函數(shù)庫簡介標(biāo)準(zhǔn)c語言包括語言標(biāo)準(zhǔn)和一組標(biāo)準(zhǔn)庫支持字符和字符串、輸入與輸出、數(shù)學(xué)函數(shù)、期與時(shí)間轉(zhuǎn)換、動(dòng)態(tài)分配和其他特性預(yù)處理器命令#include,例:下列程序段中頭文件math.h使程序能夠#include <mathh> double x,y;x = cos(y);這個(gè)庫的頭文件余弦函數(shù)cos。家

3、園家園-開發(fā)板商城/上海2.1.1 函數(shù)庫簡介對定義為函數(shù)的庫功能,標(biāo)準(zhǔn)C語言正函數(shù)以外的同名函數(shù)式宏例:假設(shè)擔(dān)心mathh中已有名為cos的宏,則可以用下面兩種實(shí)現(xiàn)提供除真方法基礎(chǔ)函數(shù)。兩者都利用宏名后面不能緊跟一個(gè)開括號的特點(diǎn),避免擴(kuò)展同名函數(shù)或宏cos。#include<mathh>double a,b,(*p)(double);p = &cos;a= (*p)(b);a= (cos)(b);* calIs function cos,always * calls function cos,always *也可以取消所有涉及到的宏的定義:#include&l

4、t;mathh>#undef cosa = cos(b);* calls function cos,always *家園-開發(fā)板商城 /上海2.1.2 C語言標(biāo)準(zhǔn)庫的歷史C語言提供的標(biāo)準(zhǔn)函數(shù)庫,函數(shù)庫通過#include進(jìn)行在C89標(biāo)準(zhǔn)中:<assert.h><locale.h><stddef.h><ctype.h><math.h><stdio.h><errno.h><float.h><limits.h><stdarg.h><time.h><

5、;setjmp.h> <signal.h><stdlib.h><string.h>在95年的修正版中<iso646.h> <wchar.h> <wctype.h>在C99中增加了六個(gè)函數(shù)庫<complex.h><tgmath.h><fenv.h><inttypes.h><stdbool.h> <stdint.h>家園家園-開發(fā)板商城/上海2.1.3 標(biāo)準(zhǔn)庫函數(shù)優(yōu)勢準(zhǔn)確性高效性 可移植性家園家園-開發(fā)板商城/上海2.1.4環(huán)

6、境和宿主環(huán)境“(freestanding)”系統(tǒng)系統(tǒng)可以不要任何類型的文件系統(tǒng),也可以基本上不要操作系統(tǒng)不要求它們提供除語言本身以外的任何東西宿主(hosted)”環(huán)境程序運(yùn)行在RC機(jī)、大型機(jī)或者介于兩者之間的計(jì)算機(jī)上家園家園-開發(fā)板商城/上海2.2 標(biāo)準(zhǔn)C語言函數(shù)標(biāo)準(zhǔn)C語言函數(shù)C兼容性家園家園-開發(fā)板商城/上海2.2.1標(biāo)準(zhǔn)C語言函數(shù)如何從標(biāo)準(zhǔn)c語言定義得到傳統(tǒng)c語言庫函數(shù)定義消除任何使用標(biāo)準(zhǔn)c語言類型的函數(shù),如long long與_Complex,或消除標(biāo)準(zhǔn)c語言中新增的函數(shù)(C89或C99).刪除限定符const、restrict與volatile符括號內(nèi)使用的s

7、tatic.刪除數(shù)組將類型void * 換成char * ,將size_t換成int。家園家園-開發(fā)板商城/上海2.2.1標(biāo)準(zhǔn)C語言函數(shù)庫函數(shù)注意事項(xiàng)庫名原則上是保留字。編程對象。不能定義與標(biāo)準(zhǔn)庫名稱同名的外部庫頭文件或文件名可以內(nèi)置在實(shí)現(xiàn)中,但仍然要被包括之后才能訪問其名稱編程可以多次按任意順序包括庫頭文件例 下面的方法可以保證庫頭文件不被包括多次:/* I Header BtddefH */#ifndef _STDDEF * Don.t try to redeclare * #define _STDDEF ltypedef int ptrdiff_t;/* 0ther defi

8、nitions */#endif家園-開發(fā)板商城 /上海2.2.2 C兼容性C+語言包括標(biāo)準(zhǔn)C語言運(yùn)行庫,但增加了幾個(gè)C+特定庫不能從c語言程序中調(diào)用c+函數(shù),但c+提供了從C+中調(diào)用c語言函數(shù)的方法在C中,c語言函數(shù)時(shí)有兩個(gè)要求要使用標(biāo)準(zhǔn)c語言原型,因?yàn)閏+要求原型。函數(shù)外部c語言要顯式地標(biāo)為具有c語言連接,即在c+的上字符串“C”。類extern后面加家園家園-開發(fā)板商城/上海2.2.2 C兼容性c語言函數(shù)中調(diào)用另一C語言函數(shù)extern int f(void);c+中調(diào)用C語言函數(shù)extern“C“int f(void);c+中要一組c語言函數(shù),則可以對所有c語言

9、函數(shù)采用連接規(guī)范:extern“C“double sqrt(double x); int f(void);家園家園-開發(fā)板商城/上海2.2.2 C兼容性從C語言或c+調(diào)用頭文件library.h在頭文件中包括extern “C”示這是個(gè)c+程序。(條件預(yù)編譯cplusplus宏),表/* File library.h */ #ifdefcplusplusextern“c” #endif/* C declarations * #ifdefcplusplus用正常c語言用戶用#endifinclude命令包裝連接extern “C“ #include”library.h“嵌入家園-開發(fā)

10、板商城/上海2.3主要的庫文件stdio.h stdlib.h string.h stdarg.h time.h setjmp.hsignal.hstddef.h math.h ctype.h erron.h stdbool.h iso645.hassert.h家園家園-開發(fā)板商城/上海2.3.1 Stddef.h語法概要之定義#include<stddefh>#define typedef typedef typedefNULLptrdiff_t; size_tj wchar_t;#define offsetof(type,member-designato

11、r)家園家園-開發(fā)板商城/上海2.3.1 Stddef.hNULLnull指針常量0轉(zhuǎn)換為類型void的0ptrdiff_t實(shí)現(xiàn)定義的帶符號整型是兩個(gè)指針相減所得到的類型size_tsizeof運(yùn)算符得到的無符號整型offsetof擴(kuò)展一個(gè)整型常量表達(dá)式#define offsetof(type,memb)(size_t)&(type*)0)->memb)家園家園-開發(fā)板商城/上海2.3.1 Stddef.h例:對于sizeof(int)為4的字節(jié)尋址計(jì)算機(jī)#include<Stddefh>struct sint a; int b;x; siz

12、e_t size,offset; ptrdiff_t diff;Diff = x.b-&x.a;Size = sizeof(x.a); offset=offsetof(struct s,b);程序運(yùn)行結(jié)果是:diff的值為1 size的值為4offset的值為4家園家園-開發(fā)板商城/上海2.3.2 math.h雙精度浮點(diǎn)數(shù)的精度進(jìn)行操作參數(shù)傳遞和錯(cuò)誤處理如果傳遞過來的參數(shù)不在其定義域內(nèi),函數(shù)會(huì)返回一些不確定的值,并將變量errno置為EDOM。如果返回值太大,無法用一個(gè)double類型表示(造成上溢),這些函數(shù)會(huì)返回HUGEVAL,并將errno置為ERANGE。如果函數(shù)結(jié)

13、果太小,無法表示,則函數(shù)返回0,errno是否設(shè)置為ERANGE由實(shí)現(xiàn)確定EDOM,ERANGE和HUGEVAL都在mathh中定義。家園家園-開發(fā)板商城/上海2.3.3 ctype.h字符處理有兩類函數(shù):分類與轉(zhuǎn)換分類函數(shù)的名稱以is開頭轉(zhuǎn)換函數(shù)的名稱以to開頭寬字符進(jìn)行運(yùn)算的分類與轉(zhuǎn)換函數(shù)分類函數(shù)isw轉(zhuǎn)換函數(shù)tow家園家園-開發(fā)板商城/上海2.3.3 ctype.h字符處理有兩類函數(shù):分類與轉(zhuǎn)換分類函數(shù)的名稱以is開頭轉(zhuǎn)換函數(shù)的名稱以to開頭寬字符進(jìn)行運(yùn)算的分類與轉(zhuǎn)換函數(shù)分類函數(shù)isw轉(zhuǎn)換函數(shù)tow通用函數(shù)分類函數(shù)wcstrans與iswctrans轉(zhuǎn)換函數(shù) wc

14、trans與towctrans家園家園-開發(fā)板商城/上海2.3.3 ctype.h例:#inelude<ctypeh> #define TRUE1#define FALSE 0int is_id(const char *s)char ch;if (ch= *s+) =0)return FALSE; /*empty string*/if(!(isalpha(ch)|ch =_) return FALSE; while (ch = *s+)!=0)if(!(isalnum(ch) | ch=_) return FALSE;return TRUE;家園家園-開發(fā)板商城ub.c

15、om/上海2.3.4 erron.h語法概要#include<errno.h>extern int errno; or # define errno #define EDOM#define ERANGE#define ETLSEQ#include<stdio.h>void perror(const char *s)#include<stringh>char *strerror(int errnum)家園家園-開發(fā)板商城/上海2.3.4 erron.herrno保存庫程序中實(shí)現(xiàn)定義的錯(cuò)誤碼,通常被定義為errno.h 中以E開頭的宏在標(biāo)準(zhǔn)c語言中,

16、errno不能是變量,但可以擴(kuò)展成int類型的任何可修改的lvalue的宏。errno用法例errno的常見用法是在調(diào)用庫函數(shù)之前先清零,隨后再進(jìn)行檢查:errno=0; x = sqrt(y); if(errno)printf(”?sqrt falled,codedn”,errno); x=0;家園家園-開發(fā)板商城/上海2.3.4 erron.hc語言實(shí)現(xiàn)通常定義一組標(biāo)準(zhǔn)錯(cuò)誤碼:EDOM參數(shù)不在數(shù)學(xué)函數(shù)能接受的域中。例如log函數(shù)的參數(shù)不能為負(fù)數(shù)參數(shù)ERANGE 數(shù)學(xué)函數(shù)的結(jié)果超出范圍EILSEQ 翻譯多字節(jié)字符序列時(shí)遇到的編碼錯(cuò)誤。這個(gè)錯(cuò)誤最終會(huì)由mbrtowc或wcrtomb

17、發(fā)現(xiàn),它們又被其他寬字符函數(shù)調(diào)用(c89增補(bǔ)l)函數(shù)strerror返回一個(gè)錯(cuò)誤消息字符串的指針,其內(nèi)容是由實(shí)現(xiàn)定義的,字符串不能修、但可以在后續(xù)調(diào)用strerror函數(shù)時(shí)覆蓋函數(shù)perror在標(biāo)準(zhǔn)錯(cuò)誤輸出流中打印下面的序列:參數(shù)字符串s、冒號、空格、包errno中當(dāng)前錯(cuò)誤碼的錯(cuò)誤短消息和新行符家園家園-開發(fā)板商城/上海2.3.4 erron.hperror 使用例子:perror 函數(shù)代替printf函數(shù)#include<math.h> #include<errno.h> errno=0;x = sqrt(y); if(errno)perror(“sqrt

18、 failed”); x=0;sqrt failed:domain error家園家園-開發(fā)板商城/上海2.3.5 bool、false、true語法概要#include<stdboolh>#define #define #define #definebool false true_Bool /*無符號整數(shù)類型,只能保存數(shù)值0和1 */ 01 bool_true_false_are_define 1家園家園-開發(fā)板商城/上海2.3.6 iso646.h語法概要#include <iso646.h>#define and #define and_e

19、q #define bitand #define bitor #define compl #define not #define not_eq #define or #define or_eq #define xor #define xor_eq&& &= &|!=|=如果調(diào)用sqrt失敗,則輸出如下:sqrtomain e家園家園-開發(fā)板商城/上海2.3.7 assert.hAssert.h函數(shù)提供標(biāo)準(zhǔn)語法概要#include<asserth> #ifndef NDGBUGvoid assert(int expression); #el

20、se#define assert(x) (void)0) #endif作用標(biāo)準(zhǔn)輸出流中打印一個(gè)診斷消息(參數(shù)文本、文件名(_FILE_)和號(_LINE_)調(diào)用abort函數(shù)或exit函數(shù)終止程序流擴(kuò)展)家園家園-開發(fā)板商城/上海2.3.7 assert.h例:測試一個(gè)條件并可能使程序終止#include <assert.h> #include <stdio.h> #include <stdlib.h> struct ITEMint key; int value;void additem(struct ITEM *itemptr)assert(i

21、temptr != NULL);int main(void)additem(NULL); return 0;家園-開發(fā)板商城 /上海2.3.8 string.hC 常用字符串處理函數(shù)及使用示例char *strncat(char *s1, const char *s2, size_t n)將字符串s2中最多n個(gè)字符添加到字符串s1的后面。s2的第一個(gè)字符重定義s1 的null終止符。返回s1的值int strcmp(const char *s1, const char *s2)比較字符串s1和字符串s2。函數(shù)在s1等于、小于或大于s2時(shí)分別返回0、小于0 或大于0的值int str

22、ncmp(const char *s1, const char *s2, size_t n)比較字符串s1中的n個(gè)字符和字符串s2。函數(shù)在s1等于、小于或大于s2時(shí)分別返回0、小于0或大于0的值家園家園-開發(fā)板商城/上海2.3.8 string.hC 常用字符串處理函數(shù)及使用示例char *strcpy(char *s1, const char *s2)將字符串s2到字符串?dāng)?shù)組s1中,返回s1的值char *strncpy(char *s1, const char *s2, size_t n)將字符串s2中最多n個(gè)字符到字符串?dāng)?shù)組s1中,返回s1的值char *strcat(cha

23、r *s1, const char *s2)將字符串s2添加到字符串s1的后面。s2的第一個(gè)字符重定義s1的null終止符。返回s1的值家園家園-開發(fā)板商城/上海2.3.8 string.hC 常用內(nèi)存處理函數(shù)void *memy(void *destin,void *source, char ch,unsigned n)了ch,則返回直接跟隨ch的在destin中的字節(jié)的一個(gè)指針若Void * memcpy(void *destin,void *source,unsigned ,unsigned n)從source一個(gè)n字節(jié)的塊到destin.如果源塊和目標(biāo)塊重迭,則選擇方向vo

24、id *memchr(void *s,char ch,unsigned n)返回在s中首先出現(xiàn)ch的一個(gè)指針;如果在s數(shù)組中不出現(xiàn)ch,就返回NULL.void *memcmp(void *s1,void *s2,unsigned n)比較正好是n字節(jié)長的兩個(gè)字符串s1和s2.些函數(shù)按無符號字符比較字節(jié)家園家園-開發(fā)板商城/上海2.3.8 string.hC 常用內(nèi)存處理函數(shù)int memicmp(void *s1,void *s2,unsigned n)比較s1和s2的前n個(gè)字節(jié),不管字符大寫或小寫.void *memmove(void *destin,void *source,

25、unsigned n)從source字節(jié)到destinvoid *memcpy(void *destin,void *source,unsigned n)從source字節(jié)到destinvoid *memset(void *s,char ch,unsigned n)將s的所有字節(jié)置于字節(jié)ch中.s數(shù)組的長度由n給出.家園家園-開發(fā)板商城/上海2.3.9 stdarg.hStdarg.h頭文件提供了可變參數(shù)表語法概要#include<stdarg.h>typedef va_list;va_start(va_list ap,type LastFixedParm) va_ar

26、g(va_list ap,type)#define #definevoid voidva_end(va_list ap); va_copy(va_list dest,va_list src);家園家園-開發(fā)板商城/上海2.3.9 stdarg.hstdargh中定義的宏、函數(shù)和類型的含義Va_list這種類型局部狀態(tài)變量,用于遍歷參數(shù)。Va_start這個(gè)宏初始化狀態(tài)變量ap,要先調(diào)用之后才能調(diào)用.將ap中的內(nèi)部指針設(shè)置成指向傳入函數(shù)的第一個(gè)可變參數(shù)。Va_arg這個(gè)宏返回參數(shù)表中下一個(gè)參數(shù)的值,將內(nèi)部參數(shù)指針(在ap中)移到下一個(gè)參數(shù)()。Va_end這個(gè)函數(shù)或宏在用va_arg

27、所有參數(shù)之后調(diào)用。Va_copy(C99)這個(gè)宏在dest中src的當(dāng)前狀態(tài),在參數(shù)表中生成第二個(gè)指針。然后可以對src與dest采用va_arg。家園家園-開發(fā)板商城/上海2.3.9 stdarg.h編寫可變個(gè)數(shù)參數(shù)的函數(shù)#include “printargsh”int arg_types =(INTARG,DBLARG,INTARG,DBLARG,0); int main()printargs(&ar9_types0,l,20,3,40); return 0;printargs的和整數(shù)類型指定符的值放在文件printargs.h中。/* file printargsh;

28、Standard C。*/ #include<stdargh>#define INTARG #define DBLARG1 /* codes used in argtypep*/ 2void printargs(int *argtypep,);家園家園-開發(fā)板商城/上海2.3.9 stdarg.h標(biāo)準(zhǔn)C語言中printargs的相應(yīng)定義如下:#include<stdio.h> #include “printargs.h”void printargs( int*argtypep,) * Standard C *va_list intap; argtype;va

29、_start(ap,argtypep);while( argtype = *argtypep+) != 0)switch(argtype)caseARG:printf(”int:dn”,va_arg(ap,int); break;case DBLARG:printf(“double:fn“,va_arg(ap,double); break;*while* va_end(ap);上海/家園 開發(fā)板商城 2.3.10 setjmp.h語法概要#include<setjmph>typedef jmp_buf; int setjmp(Jmp_buf env);void long

30、Jmp(jmp_buf env,int status)setjmp與longjmp函數(shù)實(shí)現(xiàn)非本地跳轉(zhuǎn)處理異常例外情形家園家園-開發(fā)板商城/上海2.3.10 setjmp.hjmp_buf數(shù)組類型Setjmpenv是個(gè)由實(shí)現(xiàn)定義的數(shù)組返回0Longjmpenv是個(gè)由實(shí)現(xiàn)定義的數(shù)組返回status家園家園-開發(fā)板商城/上海2.3.10 setjmp.h例#include<setjmp.h> Imp_buf ErrorEnv; int guard(void)/* Return 0 if successfult else longjmp code*/int stat

31、us = setjmp(ErrorEnv); if(status!=0) return status; /*error*/ process();return 0;int process(void)if(error_happened)longjmp(ErrorEnv,error_code);家園家園-開發(fā)板商城/上海2.3.11 signal.h語法概要#include <signal.h>#define SIG_IGN #define SIG_DFL #define SIG_ERR#define SIGxvoid(*signal(int sig,void(*func)(

32、int)(int);intraise(int sig);typedef sig_atomic_t;/* NonStandard extensionst */int int intkill(int pid,intsig);(*ssignal(int softsig,int(*func)(int)(int); gsignal(int softsig);void peignal(int sig,char* prefix);家園-開發(fā)板商城/上海2.3.11 signal.h運(yùn)用特點(diǎn)信號是(潛在的)異步信號的觸發(fā)可以通過計(jì)算機(jī)的錯(cuò)誤探測機(jī)制、用戶程序中的kill或raise函數(shù)以及程序外部

33、的操作用法:信號處理器是個(gè)用戶函數(shù)void my_handler(int the_signal)SIG_IGN signal(sig,SIG_IGN) SIG_DFL signal(sig, SIG_DFL)raise或gsignal函數(shù)在當(dāng)前進(jìn)程中發(fā)出指定的信號(或軟件信號)kill函數(shù)使特定進(jìn)程中發(fā)出指定的信號家園家園-開發(fā)板商城/上海2.3.11 signal.h運(yùn)用實(shí)例void new_handler(int sig) void(*old_handler)();/*Set new handler,saving old handler*/ old_handler = sign

34、al(sig, &new_handler); if(old_handler = SIG_ERR)fprintf(”stderr,”?Could.t establish new handlern”);/* store old handler*/ if(signal(sig,old_handler)=SIG_ERR)fprintf(“stderr,”?Could。t put back old handlern”);家園家園-開發(fā)板商城/上海2.3.11 signal.h信號處理注意事項(xiàng)如果信號是由raise或gsignal發(fā)出的,則這些函數(shù)返回其調(diào)用者。如果信號是由abort發(fā)

35、出的,則標(biāo)準(zhǔn)c語言程序終止。其他實(shí)現(xiàn)可能返回abort的調(diào)用者。如果處理的信號是SIGFPE或另一實(shí)現(xiàn)定義的計(jì)算信號,則返回時(shí)的行為是未定義的。家園家園-開發(fā)板商城/上海2.4 標(biāo)準(zhǔn)庫應(yīng)用總結(jié)編寫參數(shù)數(shù)目可變的函數(shù)字符標(biāo)準(zhǔn)C的異常處理機(jī)制對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)C語言日期操作malloc()、calloc()、realloc()NULL和NUL的區(qū)別 非格式化輸入輸出函數(shù)家園家園-開發(fā)板商城/上海2.4.1編寫參數(shù)數(shù)目可變的函數(shù)利用stdargh例:printf(" Hello,world! n" );/* no more arguments */

36、printf("%sn" , "Hello, world!");/*one more string argument*/printf("%s, %sn" , "Hello" , "world!"); /* two more string arguments*/printf("%s, %dn", "Hello", 42);/*one string, one int */家園家園-開發(fā)板商城/上海2.4.2 標(biāo)準(zhǔn)C的異常處理機(jī)制絕對終止條件結(jié)束 非

37、局部goto信號(Signals)公共變量家園家園-開發(fā)板商城/上海 絕對終止調(diào)用stdlib.habort: 粗魯?shù)亟Y(jié)束程序exit:文明地結(jié)束程兩者區(qū)別abort立即結(jié)束程序 ,不保存數(shù)據(jù)exit保存數(shù)據(jù),執(zhí)行客戶用atexit的清除代碼家園家園-開發(fā)板商城/上海 絕對終止例#include <stdio.h> #include <stdlib.h>static void atexit_handler_1(void)printf("within 'atexit_handler_1'n&qu

38、ot;);static void atexit_handler_2(void)printf("within 'atexit_handler_2'n");int main(void)atexit(atexit_handler_1); atexit(atexit_handler_2); exit(EXIT_SUCCESS);printf("this line should never appearn");結(jié)果within 'atexit_handler_2'within 'atexit_handler_1'并返

39、回碼給調(diào)用環(huán)境.comreturn 0;/ 條件結(jié)束<assert.h> 中的assert#define assert(condition) LINE)printf函數(shù)調(diào)用abort終止程序_assert(condition), #condition,FILE,自定義assert函數(shù)例:void _assert(int test, char const *test_image, char const *file, int line)if (!test)printf("Assertion failed: %s, file %s, line

40、%dn", test_image, file, line); abort();家園-開發(fā)板商城/上海 非局部goto<setjmp.h > 中的setjmp與longjmp特點(diǎn)可以goto到任何地方在程序的任意它操作特點(diǎn)jmp_buf內(nèi)容:程序位置指針、堆棧與框架指針,寄存器與內(nèi)存值setjmp(j)設(shè)置goto指針setjmp可以標(biāo)記相應(yīng)的異常處理過程longjmp來終止異常longjmp(j, r)來goto到對象j指定的地方家園家園-開發(fā)板商城/上海 非局部goto操作實(shí)例int main(void)if (set

41、jmp(j) = 0)printf("'setjmp' is initializing 'j'n"); raise_exception();/恢復(fù)上下文printf("this line should never appearn");elseprintf("'setjmp' was just jumped inton");/* 異常處理過程*/return 0;#include <setjmp.h> #include <stdio.h> jmp_buf j;voi

42、d raise_exception(void)printf("exception raisedn"); longjmp(j, 1);/* jump到異常處理過程*/printf("this line should neverappearn");運(yùn)行結(jié)果'setjmp' is initializing 'j' exception raisedsetjmp' was just jumped into家園家園-開發(fā)板商城/上海 信號(Signals)<signal.h > 中的rai

43、se與signalraise來信號,并進(jìn)入到相應(yīng)的處理過程signal兩種安裝指定處理方法:* signal(SIG* signal(SIG, SIG_DFL),/使用系統(tǒng)默認(rèn)的處理方法., SIG_IGN), /告訴系統(tǒng)忽略信號。實(shí)例void handler(int signal_value); void f(void)signal(SIGFPE, handler); /*/* . */處理過程*/raise(SIGFPE); /* 通過'SIGFPE'來調(diào)用處理過程*/家園家園-開發(fā)板商城/上海2.4.3 對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)memmove() 與memc

44、py()內(nèi)存copyMemmove 考慮到相互覆蓋memcpy 速度比 memmove 快例: 將buf從"RIGHT"改為“RIGRIGHT”static char buf ='R','I','G','H','T','0','-','-','-'Int main()int i;for (i = 0; i<6; +i)bufi + 3 = bufi;家園-開發(fā)板商城/上海2.4.4 對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)mem

45、cmp() 與strncmp()memcmp遇到NULL字符時(shí)結(jié)束memcmp()函數(shù)不能用來比較結(jié)構(gòu)的值例: 結(jié)構(gòu)體比較struct fooshort s; long l;分析(32位系統(tǒng)環(huán)境)struct foo byte0 struct foo byte1 struct foo byte2 struct foo byte3 struct foo byte4 struct foo byte5s的低位字節(jié)s的字節(jié)無用信息(使l從一個(gè)long類型邊界開始) 無用信息(使l從一個(gè)long類型邊界開始) l的最低位字節(jié)l的次低位字節(jié)struct fo家l的園次字em節(jié)bedclub.costruc

46、t foo1的最字節(jié)上海家園 開發(fā)板商城2.4.4 對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)strcpy() () 與memcpy ()strcpy()函數(shù)只能拷貝字符串,遇到NULL字符時(shí)結(jié)束memcpy()函數(shù)可以拷貝任意類型的數(shù)據(jù),指定字節(jié)數(shù)使用規(guī)則拷貝字符串時(shí),通常都使用strcpy()函數(shù)在拷貝其它數(shù)據(jù)時(shí),通常都使用memcpy()函數(shù)。家園家園-開發(fā)板商城/上海2.4.4 對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)例#include <stdio. h> #include <string. h>typedef struct cust_strint id ;char last_

47、name 20 ; char first_namel5; CUSTREC;家園家園-開發(fā)板商城/上海2.4.4 對內(nèi)存進(jìn)行操作的標(biāo)準(zhǔn)庫函數(shù)例void main (void)char * src_string = "This is the source string" ; char dest_string50;CUSTREC src_cust; CUSTREC dest_cust;printf("Hello! I'm going to copy src_string into dest_string!n"); printf("

48、Done! dest_string is: %sn" , strcpy(dest_string, src_string) ; printf("Encore! Let's copy one CUSTREC to another. n") ;prinft("I'll copy src_cust into dest_cust. n");/ * First, intialize the src_cust data members. * / src_cust. id = 1 ;strcpy(src_cust. last_name, &qu

49、ot;Strahan"); strcpy(src_cust. first_name, "Troy"); memcpy(&dest_cust, &src_cust, sizeof(CUSTREC);printf("Done! I just copied customer number # %d (%s %s). " , dest_cust. id, dest_cust. first_name, dest_cust. last_name) ;上海家園 開發(fā)板商城 日期概述Coordinated Universal Ti

50、me(UTC)世界標(biāo)準(zhǔn)時(shí)間Calendar Time:日歷時(shí)間epoch:時(shí)間點(diǎn)clock tick:時(shí)鐘計(jì)時(shí)單元家園家園-開發(fā)板商城/上海 計(jì)時(shí)C中的計(jì)時(shí)函數(shù)是clock()lock_t clock( void )#define CLOCKS_PER_SEC (clock_t)1000)家園家園-開發(fā)板商城/上海 計(jì)時(shí)實(shí)例:運(yùn)行一個(gè)循環(huán)或者處理其它到底花了多少時(shí)間#i nclude “stdio.h” #i nclude “stdlib.h” #i nclude “time.h” int main( void )longi = 100000

51、00L;clock_t start, finish;doubleduration;/* 測量一個(gè)持續(xù)的時(shí)間*/printf( "Time to do %ld empty loops is ", i ); start = clock();while( i- -); finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f secondsn", duration );system("pause");家園-開發(fā)板商城 /上

52、海 計(jì)時(shí)實(shí)例:獲得日歷時(shí)間time_t time(time_t * timer);代碼分析#include "time.h" #include "stdio.h" int main(void)struct tm *ptr; time_t lt;結(jié)果:The Calendar Time now is 1122707619即從1970年1月1日0時(shí)0分0秒到此時(shí)的秒數(shù)。lt =tiLL);printf("The Calendar Time now is %dn",lt); return 0;家園家園-開發(fā)板商城/

53、上海 計(jì)時(shí)實(shí)例:獲得日期和時(shí)間struct tm * gmtime(const time_t *timer);獲得的世界標(biāo)準(zhǔn)時(shí)間是2005年7月30日7點(diǎn)18分20秒struct tm * localtime(const time_t * timer);獲得的本地時(shí)間會(huì)比時(shí)間標(biāo)準(zhǔn)時(shí)間晚8個(gè)小時(shí)代碼分析#include "time.h" #include "stdio.h" int main(void)struct tm *local; time_t t;結(jié)果:Local hour is: 15 UTC hour is: 7t=tiLL);local=localt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論