string.h頭文件中包含的字符串函數(shù)
從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都做網(wǎng)站、網(wǎng)站制作服務(wù)體系,各種行業(yè)企業(yè)客戶(hù)提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。成都創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。
void?*memcpy(void?*dest,?const?void?*src,?size_t?n);//將n字節(jié)長(zhǎng)的內(nèi)容從一個(gè)內(nèi)存地址復(fù)制到另一個(gè)地址;如果兩個(gè)地址存在重疊,則最終行為未定義
void?*memmove(void?*dest,?const?void?*src,?size_t?n);//將n字節(jié)長(zhǎng)的內(nèi)容從一個(gè)內(nèi)存地址復(fù)制到另一個(gè)地址;與memcpy不同的是它可以正確作用于兩個(gè)存在重疊的地址
void?*memchr(const?void?*s,?char?c,?size_t?n);//在從s開(kāi)始的n個(gè)字節(jié)內(nèi)查找c第一次出現(xiàn)的地址并返回,若未找到則返回NULL
int?memcmp(const?void?*s1,?const?void?*s2,?size_t?n);//對(duì)從兩個(gè)內(nèi)存地址開(kāi)始的n個(gè)字符進(jìn)行比較
void?*memset(void?*,?int,?size_t);//用某種字節(jié)內(nèi)容覆寫(xiě)一段內(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頭開(kāi)始查找字符ch首次出現(xiàn)的位置
char?*strrchr(const?char*?str,int?ch);//從字符串str尾開(kāi)始查找字符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ò)誤碼對(duì)應(yīng)的解釋字符串,參見(jiàn)errno.h(非線程安全函數(shù))
size_t?strlen(const?char?*);//返回一個(gè)字符串的長(zhǎng)度
size_t?strspn(const?char?*s,?const?char?*strCharSet);//從字符串s的起始處開(kāi)始,尋找第一個(gè)不出現(xiàn)在strCharSet中的字符,返回其位置索引值。換句話說(shuō),返回從字符串s的起始位置的完全由strCharSet中的字符構(gòu)成的子串的最大長(zhǎng)度。strspn為string?span的縮寫(xiě)。不支持多字節(jié)字符集。
size_t?strcspn(const?char?*s,?const?char?*strCharSet);//從字符串s的起始處開(kāi)始,尋找第一個(gè)出現(xiàn)在strCharSet中的字符,返回其位置索引值。換句話說(shuō),返回從字符串s的起始位置的完全由不屬于strCharSet中的字符構(gòu)成的子串的最大長(zhǎng)度。strcspn為string?complement?span的縮寫(xiě)。不支持多字節(jié)字符集。
char?*strpbrk(const?char?*s,?const?char?*strCharSet);//在字符串s中查找strCharSet中任意字符第一次出現(xiàn)的位置的指針值。strpbrk為string?pointer?break縮寫(xiě)。不支持多字節(jié)字符集。
char?*strstr(const?char?*haystack,?const?char?*needle);//在字符串haystack中查找字符串needle第一次出現(xiàn)的位置,heystack的長(zhǎng)度必須長(zhǎng)于needle
char?*strtok(char?*strToken,?const?char?*strDelimit?);//將一個(gè)字符串strToken依據(jù)分界符(delimiter)分隔成一系列字符串。此函數(shù)非線程安全,且不可重入;但MSVC實(shí)現(xiàn)時(shí)使用了thread-local?static?variable因而是線程安全的單仍然是不可重入,即在單線程中不能對(duì)兩個(gè)源字符串交替調(diào)用該函數(shù)來(lái)分析token,應(yīng)當(dāng)對(duì)一個(gè)字符串分析完成后再處理別的字符串。
size_t?strxfrm(char?*dest,?const?char?*src,?size_t?n);//根據(jù)當(dāng)前l(fā)ocale轉(zhuǎn)換一個(gè)字符串為strcmp使用的內(nèi)部格式
1)字符串操作
strcpy(p, p1) 復(fù)制字符串
strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串
strcat(p, p1) 附加字符串
strncat(p, p1, n) 附加指定長(zhǎng)度字符串
strlen(p) 取字符串長(zhǎng)度
strcmp(p, p1) 比較字符串
strcasecmp忽略大小寫(xiě)比較字符串
strncmp(p, p1, n) 比較指定長(zhǎng)度字符串
strchr(p, c) 在字符串中查找指定字符
strrchr(p, c) 在字符串中反向查找
strstr(p, p1) 查找字符串
strpbrk(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找該集合的任一元素
strspn(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找不屬于該集合的任一元素的偏移
strcspn(p, p1) 以目標(biāo)字符串的所有字符作為集合,在當(dāng)前字符串查找屬于該集合的任一元素的偏移
* 具有指定長(zhǎng)度的字符串處理函數(shù)在已處理的字符串之后填補(bǔ)零結(jié)尾符
2)字符串到數(shù)值類(lèi)型的轉(zhuǎn)換
strtod(p, ppend) 從字符串 p 中轉(zhuǎn)換 double 類(lèi)型數(shù)值,并將后續(xù)的字符串指針存儲(chǔ)到 ppend 指向的 char* 類(lèi)型存儲(chǔ)。
strtol(p, ppend, base) 從字符串 p 中轉(zhuǎn)換 long 類(lèi)型整型數(shù)值,base 顯式設(shè)置轉(zhuǎn)換的整型進(jìn)制,設(shè)置為 0 以根據(jù)特定格式判斷所用進(jìn)制,0x, 0X 前綴以解釋為十六進(jìn)制格式整型,0 前綴以解釋為八進(jìn)制格式整型
atoi(p) 字符串轉(zhuǎn)換到 int 整型
atof(p) 字符串轉(zhuǎn)換到 double 符點(diǎn)數(shù)
atol(p) 字符串轉(zhuǎn)換到 long 整型
3)字符檢查
isalpha() 檢查是否為字母字符
isupper() 檢查是否為大寫(xiě)字母字符
islower() 檢查是否為小寫(xiě)字母字符
isdigit() 檢查是否為數(shù)字
isxdigit() 檢查是否為十六進(jìn)制數(shù)字表示的有效字符
isspace() 檢查是否為空格類(lèi)型字符
iscntrl() 檢查是否為控制字符
ispunct() 檢查是否為標(biāo)點(diǎn)符號(hào)
isalnum() 檢查是否為字母和數(shù)字
isprint() 檢查是否是可打印字符
isgraph() 檢查是否是圖形字符,等效于 isalnum() | ispunct()
一、字符數(shù)組的定義
一維字符數(shù)組:用于存儲(chǔ)和處理1個(gè)字符串,其定義格式與一維數(shù)值數(shù)組一樣。
char str[20];
二維字符數(shù)組:用于同時(shí)存儲(chǔ)和處理多個(gè)字符串,其定義格式與二維數(shù)值數(shù)組一樣。
char country[10][20];
country[i]:第i個(gè)字符串
二.字符數(shù)組的初始化
字符數(shù)組的初始化.
1.可以通過(guò)為每個(gè)數(shù)組元素指定初值字符來(lái)實(shí)現(xiàn)。
char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};
char str[ ]={"I am happy"}; 可以省略花括號(hào),如下所示
char str[ ]="I am happy";
char country[10][20]={“china”,”japanese”,……};
注意:上述這種字符數(shù)組的整體賦值只能在字符數(shù)組初始化時(shí)使用,不能用于字符數(shù)組的賦值,字符數(shù)組的賦值只能對(duì)其元素一一賦值,下面的賦值方法是錯(cuò)誤的
char str[15];
str="I am happy";
strcpy(str, "I am happy");
不是用單個(gè)字符作為初值,而是用一個(gè)字符串(注意:字符串的兩端是用雙引號(hào)“”而不是單引號(hào)‘’括起來(lái)的)作為初值。
‘a(chǎn)’ “a”區(qū)別
三、字符數(shù)組的引用
字符數(shù)組的逐個(gè)字符引用,與引用數(shù)值數(shù)組元素類(lèi)似。
(1)字符數(shù)組的輸入
除了可以通過(guò)初始化使字符數(shù)組各元素得到初值外,也可以使用getchar()或scanf()函數(shù)輸入字符。
例如:
char str[10];
…… for(i=0; i10; i++)
{ scanf(\"%c\", str);
fflush(stdin); /*清除鍵盤(pán)輸入緩沖區(qū)*/
}
這里只是一部分具體你查看這里:
首先是使用庫(kù)函數(shù)
比如下面代碼
void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //該函數(shù)還有另一個(gè)版本可以按長(zhǎng)度截取 }
還有一個(gè)函數(shù)是memcpy,這個(gè)是內(nèi)存拷貝,原型是
void memcpy(void *dest, const void *src, size_t n); 需要注意的是這個(gè)函數(shù)第一個(gè)和第二個(gè)指針都是void型且第二個(gè)指針不能被修改,第三個(gè)參數(shù)是需要拷貝的內(nèi)存長(zhǎng)度按字節(jié)記。
然后是用指針引用,注意這個(gè)并非賦值,而是引用,這種操作需要注意內(nèi)存。
char s1[] = "abcdefg";//定義一組字符串char *s2 = s1;//按照指針拷貝字符串
第三種方法就是直接賦值了
void outStrCopy(char s1[] , char s2[]){ int len1 = strlen(s1);//獲取第一個(gè)字符串的長(zhǎng)度 int len2 = strlen(s2);//獲取第二個(gè)字符串的長(zhǎng)度 int len = 0; //字符串總長(zhǎng)度 if(len1 = len2){ len = len2; //選擇COPY的長(zhǎng)度 }else{ len = len1; } for(int i = 0 ; i len ; i++){ s1[i] = s2[i]; //實(shí)現(xiàn)數(shù)據(jù)拷貝 }}
strupr:將字符串s轉(zhuǎn)換為大寫(xiě)形式
strlwr:將字符串s轉(zhuǎn)換為小寫(xiě)形式
以上兩個(gè)沒(méi)說(shuō)的!
●strlen功能:返回字符串s的長(zhǎng)度,不包括串結(jié)束字符'\0',也不是數(shù)組長(zhǎng)度;
如下幾種方式:
1)strlen("china") 結(jié)果為5
2)char s[20]="china";
strlen(s) 結(jié)果為5
3)char *s="china";
strlen(s) 結(jié)果為5
●strcpy(字符串1,字符串2): 把字符串2中的所有內(nèi)容,復(fù)制到字符串1中,不管字符串1中原先存放的是什么,全部被覆蓋(要注意的是s1的長(zhǎng)度要足夠容納s2)
●strcat(字符串1,字符串2): 將兩個(gè)字符串連接,形成一個(gè)新的字符串(要注意的是s1的長(zhǎng)度要足夠容納s1和s2,只能字符串和字符串連接,不能直接和整型,float,double等連接,不過(guò)可以加上雙引號(hào)" ",使之變成字符型)
如下:
#includestdio.h
#includestring.h
void main()
{
char a[100];
char b[100];
strcpy(a,"我愛(ài)-");
strcpy(b,"-美女");
strcat(a,b);
puts(a); /*輸出:我愛(ài)--美女*/
}
●strcmp比較字符串的大小,但不是比較s1和s2的長(zhǎng)度,而是比較對(duì)應(yīng)字符串中的ASCII碼的大小
如下:
char s1[10]="china";
char s2[10]="chz";
strcmp(s1,s2); //返回一個(gè)負(fù)數(shù),即s1s2。雖然s1的長(zhǎng)度大于s2,但比較的是ASCII碼