字符串
1,C沒(méi)有顯式的字符串類(lèi)型,以字符串常量形式出現(xiàn),存儲(chǔ)于字符數(shù)組中。
2,C字符串是一串以NUL字節(jié)結(jié)尾的字符。
1)字符內(nèi)部不能出現(xiàn)NUL字節(jié)。
2)NUL字節(jié)是字符串的終止符,不是字符串的一部分,所以字符串長(zhǎng)度不包括NUL字節(jié)。
3,頭文件string.h包含了使用字符串函數(shù)所需的原型和聲明。
4,標(biāo)準(zhǔn)庫(kù)函數(shù)有些是用匯編語(yǔ)言實(shí)現(xiàn)的,目的是充分利用機(jī)器提供的特殊字符串操作指令,可最大限度的追求速度。
字符串函數(shù)
1,字符串長(zhǎng)度strlen返回?zé)o符號(hào)整型。
1)兩字符串比較長(zhǎng)度應(yīng)直接比較大小,因?yàn)閮蔁o(wú)符號(hào)整型數(shù)相減結(jié)果永遠(yuǎn)大于等于0。
2)比較大小表達(dá)式中同時(shí)包含有符號(hào)和無(wú)符號(hào),應(yīng)將無(wú)符號(hào)強(qiáng)制轉(zhuǎn)換為有符號(hào)再計(jì)算。
2,不受限制的字符串函數(shù),通過(guò)尋找字符串參數(shù)結(jié)尾NUL字節(jié)判斷長(zhǎng)度,函數(shù)指定一塊內(nèi)存存放結(jié)果字符串,在使用這些函數(shù)時(shí),應(yīng)保證結(jié)果字符串不會(huì)溢出。
1)復(fù)制字符串strcpy,將源地址字符串復(fù)制到目的地址,如果源地址與目的地址有重疊,結(jié)果未字義,目的地址必須是字符數(shù)組或動(dòng)態(tài)內(nèi)存分配的指針,不能使用字符串常量。目的地址原參數(shù)內(nèi)容丟失,以源字符串及NUL字節(jié)結(jié)尾。使用時(shí)應(yīng)保證目標(biāo)字符數(shù)組空間足以容納需要復(fù)制的字符串,如果字符串比數(shù)組長(zhǎng),多余的字符會(huì)覆蓋數(shù)組后面內(nèi)存空間的值,strcpy無(wú)法判斷目標(biāo)字符數(shù)組的長(zhǎng)度,所以使用時(shí)就小心。
2)連接字符串strcat,將源字符串連接到目的字符串后面,如果源地址與目的地址有重疊,結(jié)果未定義,須保證字符數(shù)組足以容納源字符串。
3)strcpy和strcat返回指向目標(biāo)字符數(shù)組的指針。
4)字符串比較strcmp,兩字符串對(duì)應(yīng)字符逐個(gè)比較,直到發(fā)現(xiàn)不匹配為止,比較字符的字典序,前一字符串不匹配字符小于后一字符串字符則返回小于零的值,相等返回0,大于返回大于零的值。
3,長(zhǎng)度受限的字符串函數(shù),接受顯式長(zhǎng)度參數(shù),用于限定復(fù)制或比較的字符數(shù),防止目標(biāo)數(shù)組溢出。
1)strncpy, strncat, strncmp,復(fù)制、連接、比較指定數(shù)量字符,與不受限制版本一樣,如果源參數(shù)和目標(biāo)參數(shù)發(fā)生重疊,結(jié)果未定義。
2)strncpy將源字符串中指定長(zhǎng)度字符復(fù)制到目標(biāo)數(shù)組,如果源字符串長(zhǎng)度小于指定長(zhǎng)度,目標(biāo)數(shù)組使用NUL字符填充,如果長(zhǎng)度大于或等于指定長(zhǎng)度,指定長(zhǎng)度字符復(fù)制到目標(biāo)數(shù)組,結(jié)果可能不以NUL字節(jié)結(jié)尾,不是字符串。
3)當(dāng)使用strncpy函數(shù)創(chuàng)建字符串,應(yīng)確保字符串以NUL字節(jié)結(jié)尾,否則使用庫(kù)函數(shù)或在printf中使用%s格式碼打印時(shí)無(wú)法檢測(cè)到結(jié)束字節(jié)。
4)strncat會(huì)在結(jié)果字符串后添加NUL字符,最多在目標(biāo)字符串后連接指定長(zhǎng)度+1個(gè)字節(jié)。5)strncmp最多比較指定長(zhǎng)度字符。
4,當(dāng)調(diào)用函數(shù)請(qǐng)求操作系統(tǒng)執(zhí)行例如打開(kāi)文件等功能出現(xiàn)錯(cuò)誤時(shí),操作系統(tǒng)通過(guò)設(shè)置外部整型變量errno報(bào)告錯(cuò)誤代碼,strerror函數(shù)根據(jù)錯(cuò)誤代碼返回指向錯(cuò)誤描述字符串的指針。
5,總結(jié)
1)strlen函數(shù)計(jì)算字符串的長(zhǎng)度,返回值是一個(gè)無(wú)符號(hào)整數(shù)。
2)strcpy函數(shù)把一個(gè)字符串從一個(gè)位置復(fù)制到另一個(gè)位置。
3)strcat函數(shù)把一個(gè)字符串的拷貝添加到另一字符串的后面。
4)strcpy和strcat函數(shù)都假定它們的參數(shù)是有效的字符串,如果源字符串和目標(biāo)字符串出現(xiàn)重疊,函數(shù)的結(jié)果未定義。
5)strcmp對(duì)兩個(gè)字符串進(jìn)行詞典序比較,返回值提示第一個(gè)字符串是大于、小于還是等于第二個(gè)字符串。
6)長(zhǎng)度受限的函數(shù)strncpy、strncat、strncmp類(lèi)似對(duì)應(yīng)的不受限制版本,區(qū)別在于這些函數(shù)接受一個(gè)長(zhǎng)度參數(shù)。
7)strncpy中長(zhǎng)度指定了多少個(gè)字符將寫(xiě)入到目標(biāo)字符數(shù)組中,如果源字符串比指定長(zhǎng)度更長(zhǎng),結(jié)果字符串將不會(huì)以NUL字節(jié)結(jié)尾。
8)strncat函數(shù)的長(zhǎng)度參數(shù)指定從源字符串復(fù)制過(guò)來(lái)的字符最大數(shù)目,但它的結(jié)果始終是以一個(gè)NUL字節(jié)結(jié)尾。
9)strncmp函數(shù)長(zhǎng)度參數(shù)用于限定字符比較的數(shù)目,如果兩個(gè)字符串在指定的數(shù)目里不存在區(qū)別,便認(rèn)定是相等的。
查找函數(shù)
1,字符查找
1)strchr在字符串中查找某個(gè)特定字符第一次出現(xiàn)的位置,返回指向該位置指針,未找到返回NULL指針。
2)strrchr在字符串中查找某個(gè)特定字符最后一次出現(xiàn)的位置,返回指向該位置指針,未找到返回NULL指針。
3)strpbrk在字符串中查找另一字符串中任意字符第一次出現(xiàn)的位置,返回指向匹配字符位置指針,未找到返回NULL指針。
2,子串查找
1)strstr在字符串中查找子串第一次出現(xiàn)的位置,返回指向匹配子串的起始位置,未找到返回NULL指針。
2)標(biāo)準(zhǔn)庫(kù)不存在strrpbrk和strrstr函數(shù)。
3,字符串前綴查找。
1)strspn字符串與另一字符串中任意字符匹配的字符數(shù),當(dāng)出現(xiàn)不匹配字符時(shí)停止查找。
2)strcspn字符串不與另一字符串任意字符匹配的字符數(shù),當(dāng)出現(xiàn)匹配字符時(shí)停止查找。
4,標(biāo)記查找,用于提取分隔符隔開(kāi)的字符串。
1)strtok第一個(gè)參數(shù)指定一個(gè)字符串,第二個(gè)字符串參數(shù)是分隔符的集合,在字符串中找到分隔符集合中的下一個(gè)標(biāo)記,將其用NULL結(jié)尾,返回指向標(biāo)記的指針。
2)strtok第一個(gè)參數(shù)為NULL時(shí),函數(shù)在同一個(gè)字符串中從被返回的位置像前一次一樣查找下一個(gè)標(biāo)記,如果字符串中不存在分隔符,返回NULL指針。
3)典型情況下,第一次調(diào)用strtok傳遞一個(gè)指向字符串的指針,之后函數(shù)重復(fù)調(diào)用,第一個(gè)參數(shù)為NULL,直到返回NULL為止。
字符操作
1,標(biāo)準(zhǔn)庫(kù)包含兩組函數(shù)操作單獨(dú)的字符,原型位于頭文件ctype.h中,第一組用于對(duì)字符分類(lèi),第二組用于轉(zhuǎn)換字符。
2,分類(lèi)函數(shù)接受一個(gè)字符值的整型參數(shù),返回整型值,表真或假。
1)iscntrl控制字符
2)isspace空白字符:空格,換頁(yè)\f,換行\(zhòng)n,回車(chē)\r,制表符\t,垂直制表符\v
3)isdigit十進(jìn)制數(shù)字0~9
4)isxdigit十六進(jìn)制數(shù)字,0~9,a~f,A~F
5)islower 小寫(xiě)字母a~z
6)isupper大寫(xiě)字母A~Z
7)isalpha字母a~z、A~Z
8)isalnum數(shù)字0~9,字母a~z、A~Z
9)ispunct標(biāo)點(diǎn)符號(hào),任何不屬于數(shù)字和字母的圖形字符(可打印符號(hào))
10)isgraph任何圖形字符
11)isprint任何可打印字符,包括圖形字符和空白字符
3,轉(zhuǎn)換函數(shù)tolower,toupper將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)或?qū)⑿?xiě)字母轉(zhuǎn)換為大寫(xiě),其他不變。
內(nèi)存操作
1,字符串由NUL字節(jié)結(jié)尾,內(nèi)部不能包含NUL字符,非字符串?dāng)?shù)據(jù)內(nèi)部包含零值時(shí)不能使用字符串函數(shù),可使用另一組相關(guān)函數(shù),操作與字符串函數(shù)類(lèi)似,可以處理任意的字符序列。
1)內(nèi)存操作函數(shù)與strn前綴的函數(shù)不同,遇到NUL字節(jié)時(shí)不會(huì)停止操作。
2)字符串是零個(gè)或多個(gè)字符的序列,以NUL字節(jié)結(jié)尾。
2,memcpy從源地址復(fù)制n個(gè)字節(jié)到目標(biāo)地址,可以復(fù)制任何類(lèi)型的值,字符、整型等。
1)參數(shù)類(lèi)型是void*型指針,任何類(lèi)型的指針都可以轉(zhuǎn)換為void*型指針。
2)對(duì)于長(zhǎng)度大于一個(gè)字節(jié)的數(shù)據(jù),在第三個(gè)參數(shù)里數(shù)量和數(shù)據(jù)類(lèi)型長(zhǎng)度相乘,可以使用這種方式復(fù)制結(jié)構(gòu)或結(jié)構(gòu)數(shù)組。
3)目標(biāo)參數(shù)與源參數(shù)重疊結(jié)果未定義。
3,memmove與memcpy類(lèi)似,但源地址和目標(biāo)地址可以重疊,將源操作數(shù)據(jù)復(fù)制到臨時(shí)位置,臨時(shí)位置不會(huì)與源地址和目標(biāo)地址重疊,再?gòu)呐R時(shí)位置復(fù)制到目標(biāo)地址。
1)memmove通常無(wú)法使用某些機(jī)器提供的特殊字節(jié)或字符串處理指令。
2)可能比memcpy慢,但如果源地址與目標(biāo)地址可能存在重疊時(shí)應(yīng)該使用memmove。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-498144.html
4,memcmp對(duì)兩段內(nèi)存內(nèi)容比較n個(gè)字節(jié),按照無(wú)符號(hào)字符逐字節(jié)比較,如果比較的不是單字節(jié)數(shù)據(jù)如整型或浮點(diǎn)數(shù)時(shí)可能出現(xiàn)不可預(yù)料結(jié)果。
5,memchr查找字符在字符串中第一次出現(xiàn)的位置,返回指向該位置的指針,共查找n個(gè)字節(jié),如果n個(gè)字節(jié)中未找到該字符,返回NULL指針。
6,memset將目標(biāo)地址前n個(gè)字節(jié)設(shè)置為字符值,可用于字符數(shù)組初始化。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-498144.html
到了這里,關(guān)于C和指針(六)字符串、字符、字節(jié)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!