因?yàn)镃語言中,數(shù)組初始化時(shí),如果給定的初始值個(gè)數(shù)小于數(shù)組長度,那么后面的剩余元素將被自動(dòng)初始化為0,也就是字符串的結(jié)束標(biāo)志'\0'
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),連平網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:連平等地區(qū)。連平做網(wǎng)站價(jià)格咨詢:028-86922220
strcmp()函數(shù)就是用于查找兩個(gè)以'\0'結(jié)束的字符串中的第一個(gè)不相同的字符的ASCII值之差,如果將數(shù)組長度改為5,那么strcmp函數(shù)在前5個(gè)字符中找不到結(jié)束標(biāo)志,又因?yàn)槌绦虿粫?huì)對邊界進(jìn)行檢查,所以會(huì)一直找下去,而此時(shí),早已越界,所以會(huì)輸出不可預(yù)見的結(jié)果。
string.h頭文件中包含的字符串函數(shù)
void?*memcpy(void?*dest,?const?void?*src,?size_t?n);//將n字節(jié)長的內(nèi)容從一個(gè)內(nèi)存地址復(fù)制到另一個(gè)地址;如果兩個(gè)地址存在重疊,則最終行為未定義
void?*memmove(void?*dest,?const?void?*src,?size_t?n);//將n字節(jié)長的內(nèi)容從一個(gè)內(nèi)存地址復(fù)制到另一個(gè)地址;與memcpy不同的是它可以正確作用于兩個(gè)存在重疊的地址
void?*memchr(const?void?*s,?char?c,?size_t?n);//在從s開始的n個(gè)字節(jié)內(nèi)查找c第一次出現(xiàn)的地址并返回,若未找到則返回NULL
int?memcmp(const?void?*s1,?const?void?*s2,?size_t?n);//對從兩個(gè)內(nèi)存地址開始的n個(gè)字符進(jìn)行比較
void?*memset(void?*,?int,?size_t);//用某種字節(jié)內(nèi)容覆寫一段內(nèi)存空間
char?*strcat(char?*dest,?const?char?*src);//在字符串dest之后連接上src
char?*strncat(char?*dest,?const?char?*src,?size_t?n);//從src截取n個(gè)字符連接在字符串dest之后,返回dest字符串
char?*strchr(const?char*?str,?int?ch);//從字符串str頭開始查找字符ch首次出現(xiàn)的位置
char?*strrchr(const?char*?str,int?ch);//從字符串str尾開始查找字符ch首次出現(xiàn)的位置
int?strcmp(const?char?*,?const?char?*);//基于字典順序比較兩個(gè)字符串
int?strncmp(const?char?*,?const?char?*,?size_t);//基于字典順序比較兩個(gè)字符串,最多比較n個(gè)字節(jié)
int?strcoll(const?char?*,?const?char?*);//基于當(dāng)前區(qū)域設(shè)置的字符順序比較兩個(gè)字符串
char?*strcpy(char*?str1,?const?char*?str2);//將str2拷貝給str1
char?*strncpy(char*?str1,?const?char*?str2,?size_t?n);//截取str2的n個(gè)字符拷貝給str1
char?*strerror(int);//返回錯(cuò)誤碼對應(yīng)的解釋字符串,參見errno.h(非線程安全函數(shù))
size_t?strlen(const?char?*);//返回一個(gè)字符串的長度
size_t?strspn(const?char?*s,?const?char?*strCharSet);//從字符串s的起始處開始,尋找第一個(gè)不出現(xiàn)在strCharSet中的字符,返回其位置索引值。換句話說,返回從字符串s的起始位置的完全由strCharSet中的字符構(gòu)成的子串的最大長度。strspn為string?span的縮寫。不支持多字節(jié)字符集。
size_t?strcspn(const?char?*s,?const?char?*strCharSet);//從字符串s的起始處開始,尋找第一個(gè)出現(xiàn)在strCharSet中的字符,返回其位置索引值。換句話說,返回從字符串s的起始位置的完全由不屬于strCharSet中的字符構(gòu)成的子串的最大長度。strcspn為string?complement?span的縮寫。不支持多字節(jié)字符集。
char?*strpbrk(const?char?*s,?const?char?*strCharSet);//在字符串s中查找strCharSet中任意字符第一次出現(xiàn)的位置的指針值。strpbrk為string?pointer?break縮寫。不支持多字節(jié)字符集。
char?*strstr(const?char?*haystack,?const?char?*needle);//在字符串haystack中查找字符串needle第一次出現(xiàn)的位置,heystack的長度必須長于needle
char?*strtok(char?*strToken,?const?char?*strDelimit?);//將一個(gè)字符串strToken依據(jù)分界符(delimiter)分隔成一系列字符串。此函數(shù)非線程安全,且不可重入;但MSVC實(shí)現(xiàn)時(shí)使用了thread-local?static?variable因而是線程安全的單仍然是不可重入,即在單線程中不能對兩個(gè)源字符串交替調(diào)用該函數(shù)來分析token,應(yīng)當(dāng)對一個(gè)字符串分析完成后再處理別的字符串。
size_t?strxfrm(char?*dest,?const?char?*src,?size_t?n);//根據(jù)當(dāng)前l(fā)ocale轉(zhuǎn)換一個(gè)字符串為strcmp使用的內(nèi)部格式
/*解決一般長度的可以。。因?yàn)槭褂昧藰闼氐淖址ヅ渌惴?,所以效率不算高,KMP算法更好一些。
以下是源碼:*/
/*strstr?function*/
#includestring.h
char?*(strstr)(const?char?*s1,?const?char?*s2)
{ /*?find?first?occurrence?of?s2[]?in?s1[]?*/
if?(*s2?==?'\0')
return?((char*)s1);
for?(;?(s1?=?strchr(s1,?*s2))?!=?NULL;?++s1){/*match?rest?of?prefix*/
const?char?*sc1,?*sc2;
for?(sc1?=?s1,?sc2?=?s2;;)
if?(*++sc2?==?'\0')
return?((char?*)s1);
else?if?(*++sc1?!=?*sc2)
break;
}
return?(NULL);
}
/*strchr?function*/
#includestring.h
char?*(strchr)(const?char?*s,?int?c)
{ /*?find?first?occurrence?of?c?in?char?s[]?*/
const?char?ch?=?c;
for?(;?*s?!=?ch;?++s)
if?(*s?==?'\0')
return?(NULL);
return?((char*)?s);
}
C語言提供了幾個(gè)標(biāo)準(zhǔn)庫函數(shù),可以比較兩個(gè)字符串是否相同。以下是用strcmp()函數(shù)比較字符串的一個(gè)例子:
#include stdio. h
#include string. h
void main (void);
void main(void)
{
char* str_1 = "abc" ; char * str_2 = "abc" ; char* str_3 = "ABC" ;
if (strcmp(str_1, str_2) == 0)
printf("str_1 is equal to str_2. \n");
else
printf("str_1 is not equal to str_2. \n");
if (strcmp(str_1, str_3) == 0)
printf("str_1 is equal to str_3.\n");
else
printf("str_1 is not equalto str_3.\n");
}
上例的打印輸出如下所示:
str_1 is equal to str_2.
str_1 is not equal to str_3.
strcmp()函數(shù)有兩個(gè)參數(shù),即要比較的兩個(gè)字符串。strcmp()函數(shù)對兩個(gè)字符串進(jìn)行大小寫敏感的(case-sensitiVe)和字典式的(lexicographic)比較,并返回下列值之一:
----------------------------------------------------
返 回 值 意 義
----------------------------------------------------
0 第一個(gè)字符串小于第二個(gè)字符串
0 兩個(gè)字符串相等 ·
0 第一個(gè)字符串大于第二個(gè)字符串
----------------------------------------------------
在上例中,當(dāng)比較str_1(即“abc”)和str_2(即“abc”)時(shí),strcmp()函數(shù)的返回值為0。然而,當(dāng)比較str_1(即"abc")和str_3(即"ABC")時(shí),strcmp()函數(shù)返回一個(gè)大于0的值,因?yàn)榘碅SCII順序字符串“ABC”小于“abc”。
strcmp()函數(shù)有許多變體,它們的基本功能是相同的,都是比較兩個(gè)字符串,但其它地方稍有差別。下表列出了C語言提供的與strcmp()函數(shù)類似的一些函數(shù):
-----------------------------------------------------------------
函 數(shù) 名 作 用
-----------------------------------------------------------------
strcmp() 對兩個(gè)字符串進(jìn)行大小寫敏感的比較
strcmpi() 對兩個(gè)字符串進(jìn)行大小寫不敏感的比較
stricmp() 同strcmpi()
strncmp() 對兩個(gè)字符串的一部分進(jìn)行大小寫敏感的比較
strnicmp() 對兩個(gè)字符串的一部分進(jìn)行大小寫不敏感的比較
-----------------------------------------------------------------
在前面的例子中,如果用strcmpi()函數(shù)代替strcmp()函數(shù),則程序?qū)⒄J(rèn)為字符串“ABC”等于“abc”。