C標頭檔案ctype h介面與實現

2021-10-07 04:38:04 字數 2785 閱讀 8974

ctype.h屬於c語言標準庫標頭檔案,提供了數字和字元的判別與大小寫轉化函式。

介面:判斷正確返回非零值,錯誤返回零

int

islower

(unsigned

char);

//是否為小寫字母。

intisupper

(char);

//是否為大寫字母。

intisalpha

(char);

//是否為字母。

intisdigit

(char);

//是否為數字。

intisxdigit

(char);

//是否為16進製制數。

intisalnum

(char);

//是否為數字字母,也就是數字,字母,數字和字母。

intispunct

(char);

//是否為標點符號。

intisgraph

(char);

//是否為除空格以外的,所有可列印出來的字元。

intisprint

(char);

//是否為包括空格的,所有可列印出來的字元。

intisspace

(char);

//是否為空格,換頁符,換行符,回車符,水平製表符,垂直製表符。

intiscntrl

(char);

//是否為控制字元。

inttolower

(char);

//轉換為小寫

inttoupper

(char);

//轉換為大寫

實現

出於執行速度考慮,以上函式都是用巨集實現的。但標準庫中也提供的(function)形式的函式實現,很少用到。

#define islower(c) (_ctype[(int)(c)] & _lo)

#define isupper(c) (_ctype[(int)(c)] & _up)

#define isalpha(c) (_ctype[(int)(c)] & (_lo | _up | _xa))

#define isdigit(c) (_ctype[(int)(c)] & _di)

#define isxdigit(c) (_ctype[(int)(c)] & _xd)

#define isalnum(c) (_ctype[(int)(c)] & (_di | _lo | _up | _xa))

#define ispunct(c) (_ctype[(int)(c)] & _pu)

#define isgraph(c) (_ctype[(int)(c)] & (_dt | _lo | _pu | _up | xa))

#define isprint(c) (_ctype[(int)(c)] & (_di | _lo | _pu | _sp | _up | _xa))

#define isspace(c) (_ctype[(int)(c)] & (_cn | _sp | _xs))

#define iscntrl(c) (_ctype[(int)(c)] & (_bb | _cn))

#define tolower(c) _tolower[(int)(c)]

#define toupper(c) _toupper[(int)(c)]

下面對以上巨集定義進行分析:

_ctype _tolower _toupper 是三個short型指標,之所以是short,是因為其要操作的三個陣列皆為const short型。

這三個陣列也是實現這些巨集所定義的功能的關鍵。

在這之前,先給出輔助巨集的定義,輔助巨集的作用就是在通過位與運算得到函式結果值時提供「基準」。

#define _xa		0x200 

//額外字母

#define _xs 0x100

//額外空格

#define _bb 0x80

//bel, bs,etc.

#define _cn 0x40

//cr, ff, ht, nl, vt

#define _di 0x20

//'0' - '9'

#define _lo 0x10

//'a' - 'z'

#define _pu 0x08

//符號

#define _sp 0x04

//空格

#define _up 0x02

//'a' - 'z'

#define _xd 0x01

//'0' - '9', 'a' - 'f', 'a' - 'f'

可以看到這些輔助巨集都是一些16進製制數。

而_ctype _tolower _toupper 這三個指標操作的陣列內容太大,具體可參見《c標準庫》p40~p42

_ctype陣列對應於asci碼的各個符號建立掩碼。

其中_ctype操作的陣列要注意由於eof的存在,所以_ctype從陣列第二位開始操作。

通過將引數c轉化為asci碼,並將其在_ctype操作的陣列的對應位置的掩碼與基準做位與運算即可得出結果。

結果為0,判斷錯誤。結果為非零,判斷正確。

_tolower和_toupper則比較簡單,將引數c轉化成asci碼後,直接從對方操作的陣列(_tolower操作的陣列與_toupper操作的陣列)中取得對應位置的值即可。在這兩個陣列中字母部分不是掩碼。而是,乙個是小寫字母,乙個是大寫字母。

ctype h標頭檔案

1 字元測試函式 1 函式原型均為int is x int 2 引數為int,任何 實參均被提公升成整型 3 只能正確處理處於 0,127 之間的值 2 字元對映函式 1 函式原型為int to x int 2 對引數進行檢測,若符合範圍則轉換,否則不變 int tolower int a z a ...

ctype h標頭檔案詳解

是乙個與字元處理有關的標頭檔案,它包含了一系列用於檢測和轉換單個字元的函式。中的函式都只有乙個引數,就是要檢測或者要轉換的字元,並且這個引數的型別是 int,它可以表示乙個有效字元,或者乙個eof 無效字元 中的函式的返回值也都是 int 型別,它可以表示乙個有效字元,或者乙個eof 無效字元 或者...

C 標頭檔案與C標頭檔案

include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 include 定義本地化函式 include ...