C風(fēng)格字符串

關(guān)于C風(fēng)格字符串的問題
?C++有string為什么還要學(xué)習(xí)C風(fēng)格字符串?
某些場景使用C風(fēng)格字符串更方便、更高效
C標(biāo)準(zhǔn)庫、Linux庫 、開源庫和數(shù)據(jù)庫的接口函數(shù),一定有C語言但不一定有C++(MySQL的接口函數(shù)只有C而沒有C++)
String是類,封裝了C風(fēng)格字符串(學(xué)習(xí)C風(fēng)格字符串能幫助理解String類)
??C中字符數(shù)組與字符串的區(qū)別
C中字符串的末尾會(huì)有/0
,而字符數(shù)組沒有
C風(fēng)格字符串的使用
字符串的初始化
清空字符串
使用memset()
函數(shù)清空字符串
語法:memset(字符數(shù)組的首地址即數(shù)組名,0,數(shù)組內(nèi)存的空間大小)
字符串復(fù)制或賦值
?C語言字符串不能用" = "賦值
strcpy()函數(shù)
語法:strcpy(目標(biāo)字符串,源字符串)
返回值:返回目標(biāo)字符串的首地址
?復(fù)制完字符串后,會(huì)自動(dòng)在目標(biāo)字符串后面追加' /0 '
如果目標(biāo)字符串所指向的內(nèi)存不夠大,則會(huì)導(dǎo)致數(shù)組越界
strncpy()函數(shù)
語法:strncpy(目標(biāo)字符串,源字符串,n個(gè)字符)
返回值:返回目標(biāo)字符串的首地址
?如果源字符串小于n,則拷貝完后會(huì)在目標(biāo)字符串后追加' /0 '
如果源字符串大于或等于n,則截取前n個(gè)字符,且不會(huì)再目標(biāo)字符串后追加' /0 '
如果目標(biāo)字符串所指向的內(nèi)存不夠大,則會(huì)導(dǎo)致數(shù)組越界
?
字符串長度
語法:strlen(字符串的首地址即字符串名)
?
字符串拼接
strcat()函數(shù)
語法:strcat(目標(biāo)字符串,源字符串) ==目標(biāo)字符串原有的'/0'會(huì)被覆蓋掉==
strncat()函數(shù)
語法:strcat(目標(biāo)字符串,源字符串,n個(gè)字符) ==目標(biāo)字符串原有的'/0'會(huì)被覆蓋掉==
?
字符串比較
目標(biāo)字符串與源字符串(或源字符串前n個(gè)字符)比較返回值>1(ASCII碼的差)=0<-1(ASCII碼的差)
strcmp()函數(shù)
語法:strcmp(目標(biāo)字符串,源字符串)
strncmp()函數(shù)
語法:strcmp(目標(biāo)字符串,源字符串,前n個(gè)字符)
?
字符查找
strchr(字符串,要查找的字符) 【是從一個(gè)字符串str中第一次出現(xiàn)該字符character的位置】
strrchr(字符串,要查找的字符)【是從一個(gè)字符串str中最后一次出現(xiàn)該字符character的位置】
返回值:如果在字符串 str 中找到字符 c,則函數(shù)返回指向該字符的指針,存在和首地址相減,可以得到下標(biāo)。如果未找到該字符則返回 NULL。
?
字符串查找
語法:strstr(字符串,子串)
返回值:返回子串在字符串中第一次出現(xiàn)的地址,沒有返回0
?C風(fēng)格字符串的注意事項(xiàng)
1?字符串的結(jié)尾標(biāo)志為'/0',在處理時(shí)會(huì)從起始位置開始搜索直到搜索到'/0'為止
不會(huì)判斷數(shù)組越界的原因:
操作字符串的函數(shù)形參為指針,只存放了字符串的起始地址,沒有字符串的長度參數(shù),無法判斷是否越界
2?結(jié)尾標(biāo)識(shí)符'/0'后面都是垃圾值
3?字符串在每次使用前都要初始化
4?不要再子函數(shù)里面使用sizeof運(yùn)算符(因?yàn)樽雍瘮?shù)中的參數(shù)為指針,總是占8字節(jié)(64位操作系統(tǒng)))
5?在VS中使用C風(fēng)格字符串是應(yīng)加上#define _CRT_SECURE_NO_WARNINGS
?