iOS學(xué)習(xí)(C語(yǔ)言)知識(shí)點(diǎn)整理
一、字符串的操作
1)字符串的存儲(chǔ),字符數(shù)組,在堆里面申請(qǐng)內(nèi)存空間。
實(shí)例代碼:
#include <stdlib.h>#include <string.h>int main(){ char str[100] = "hello world"; char *p = "hello world"; //*p ='H';//常量字符串不可以修改,p指向只讀的地址 p = str; *p = 'H'; // p = (char*)malloc(100); //判空 if(p==NULL) return 0; //清零 memset(p,0,100); printf("p=%p/n",p); //字符串賦值 //memcpy(p, "helloworld", 10);//方法一:內(nèi)存拷貝 sprintf(p,"%s","helloworld");//方法二:sprintf()輸出賦值 //p = "helloworld";//錯(cuò)誤,p指向常量區(qū),把申請(qǐng)的內(nèi)存都丟了 printf("p=%p/n",p); printf("%s",p); //釋放 free(p); return 0;}
2)字符操作函數(shù), 形參為對(duì)應(yīng)參數(shù)的ASCII碼值,滿足條件返回1,不滿足返回0 ; 需要引用頭文件#include <ctype.h>
1、int isalnum(int);// 判斷是否是數(shù)字或者字母
2、int isalpha(int);//判斷是否是英文字符
3、int isdigit(int);//判斷是否是數(shù)字 0~9
4、int islower(int);//判斷是否是小寫(xiě)字母
5、int isupper(int);//判斷是否是大寫(xiě)字母
6、int isxdigit(int);//是否是16進(jìn)制數(shù)字
7、int tolower(int);//轉(zhuǎn)成小寫(xiě)
8、int toupper(int);//轉(zhuǎn)成大寫(xiě)
9、int digittoint(int);//把十六進(jìn)制數(shù)字字符轉(zhuǎn)換成整型
10、int ishexnumber(int);//等價(jià) isxdigit
11、int isnumber(int);//等價(jià)isdigit
實(shí)例代碼:
1 #include <ctype.h> 2 int main() 3 { 4 printf("%d/n",isalnum('1'));//1 5 printf("%d/n",isalpha('1'));//0 6 printf("%d/n",isdigit('a'));//0 7 printf("%d/n",islower('A'));//0 8 printf("%d/n",isupper('a'));//0 9 printf("%d/n",isxdigit('F')); //110 printf("%c/n",tolower('A'));//a11 printf("%c/n",toupper('a'));//A12 printf("%d/n",digittoint('1'));//113 printf("%d/n",ishexnumber('a'));//114 printf("%d/n",isnumber('a'));//015 return 0;16 }
3)字符串拷貝 使用strcpy或strncpy 后者可以指定拷貝長(zhǎng)度。
實(shí)例代碼:
1 int main() 2 { 3 char str[20] ="XXXXXXXXXXXXXX"; 4 char *p = "hello"; 5 strcpy(str,p);//從p的位置拷貝字符串,把p后面的'/0'也拷貝過(guò)來(lái).如果接收的字符串空 間不夠大,可能會(huì)越界 。 6 printf("%s/n",str);//從str開(kāi)始,打印到/0結(jié)束 7 for(int i=0;i<10;i++){ 8 printf("str[%d]=%c=%d/n",i,str[i],str[i]); 9 }10 unsigned long len=strlen(str);11 strncpy(str,p,len-1);//最后的參數(shù):最大拷貝字符數(shù).一般設(shè)置為目的字符串bufsize-1,預(yù)留結(jié)束符12 str[len-1] = '/0';//數(shù)組的最后的一個(gè)元素置為結(jié)束符13 printf("%s/n",str);//從str開(kāi)始,打印到/0結(jié)束14 15 }
4)字符串比較函數(shù) strcmp, strncmp 后者可以限定比較字符串的長(zhǎng)度,如果相等比較結(jié)果等于0,如果s1>s2 結(jié)果大于0;
如果s1<s2 結(jié)果小于0;比較結(jié)果等于字符串中首個(gè)不相等字符的ascii碼的差值。
實(shí)例代碼:
1 int main() 2 { 3 char *p1 = "helloAworld"; 4 char *p2 = "helloB"; 5 int rst; 6 rst = strcmp(p1, p2); 7 printf("rst = %d/n",rst);//結(jié)果:-1 8 rst = strncmp(p1, p2, 2);//2表示比較的最大長(zhǎng)度 9 printf("rst = %d/n",rst);//結(jié)果:010 return 0;11 }
5)查找字符串函數(shù)
1、strchr 從左往右正向查找。
2、strrchr 從右往左逆向查找。
3、strstr 返回 s2字符串在s1字符串中第一次出現(xiàn)的位置,找不到對(duì)應(yīng)的字串, 返回NULL。
實(shí)例代碼:
1 int main() 2 { 3 char *p = "hello china world"; 4 char *pRst; 5 pRst = strchr(p,'X');//找不到返回NULL 6 printf("%s/n",pRst); 7 printf("%s/n",strchr(p,'l'));//正向 8 printf("%s/n",strrchr(p,'l'));//逆向 9 pRst = strstr(p,"china");10 printf("%s/n",pRst);11 return 0;12 }
6)字符串拼接函數(shù)
1、strcat, 結(jié)構(gòu)char *strcat(char *dst, const char *src) dst 指向的內(nèi)存剩余的空間要足夠容納src字 符串,dst src 指向的內(nèi)存不能重疊。
2、strncat,結(jié)構(gòu)char *strncat(char *, const char *, size_t n) size_t n: 最大拼接字符個(gè)數(shù)//數(shù)組的長(zhǎng)度-當(dāng)前的有效個(gè)數(shù)-1(預(yù)留結(jié)束符)
實(shí)例代碼:
1 int main() 2 { 3 char str[20] = "hello"; 4 strcat(str," world");//在原字符串的末尾,加上新的字符串 5 printf("%s/n",str); 6 int len = (int)strlen(str); 7 strncat(str,"hello world",20-len-1); 8 len = (int)strlen(str); 9 printf("strlen=%d,%s/n",len,str);10 return 0;11 }
7)字符串分割函數(shù) strtok 結(jié)構(gòu)char *strtok(char *src, const char *demi)。
1、strtok 把src字符串中所有的分隔符變成'/0'
2、直接修改原字符串
3、只有第一次調(diào)用的時(shí)候需要傳遞字符串的首地址, 從第二次開(kāi)始需要傳遞NULL
4、寫(xiě)一個(gè)函數(shù)實(shí)現(xiàn)截取字符串并提取被截?cái)嗟娜我徊糠肿址?/p>
實(shí)現(xiàn)代碼:
1 void* splitstr(char *str,char *sp,int index){ 2 char *result = NULL; 3 result = strtok( str, sp ); 4 int num=0; 5 while( result != NULL ) { 6 if(num==index) 7 break; 8 result = strtok( NULL, sp ); 9 num++;10 }11 return result;12 }13 14 int main(){15 char str[] = "我愛(ài)#中華#人民#共和國(guó)";16 char sp[] = "#";17 char *spstr=str;18 char *spf=sp;19 char *result = (char*)splitstr(spstr,spf,2);//結(jié)果:人民20 printf("%s",result);21 return 0;22 }
8)檢索字符串
1、strpbrk 函數(shù);結(jié)構(gòu)為 char *strpbrk(const char *s1, const char *s2);依次檢索s1中的字符,
當(dāng)s2中也包含時(shí),停止檢索,并返回該字符位置.
2、strspn 函數(shù);結(jié)構(gòu)為 size_t strspn(const char *s1, const char *s2);//s1中s1開(kāi)頭連續(xù)的都在s2中的字符數(shù)
實(shí)例代碼:
1 int main()2 {3 char *p1 = "hello world";4 char *p2 = "girl";5 printf("%s/n",strpbrk(p1,p2));//'l'在p2也有,'l'是2個(gè)字符串的第一個(gè)公共字符,返回在p1中的地址6 char *p3 = "lehRwsrt";7 printf("%lu/n",strspn(p1,p3));//p1中,前4個(gè)字符,在p3中也存在8 return 0;9 }
9)提取整數(shù), 以數(shù)字開(kāi)頭提取到字母截止 ;實(shí)現(xiàn)函數(shù)有
1、atoi 用于提取 int類(lèi)型數(shù)據(jù)
2、atof 用于提取 double,float等浮點(diǎn)型數(shù)據(jù)
3、atol 用于提取 long 等長(zhǎng)整形數(shù)據(jù)
實(shí)例代碼:
1 int main(){ 2 int a; 3 a=atoi("2adse"); 4 printf("a=%d/n",a); 5 6 double d; 7 d=atof("122dsf3.34f4"); 8 printf("d=%.3f/n",d); 9 10 long l;11 l=atol("23454df3556s");12 printf("l=%ld/n",l);13 return 0;14 }
10)反轉(zhuǎn)字符串
實(shí)例代碼:
1 char *reverse(char *s){ 2 char ch; 3 unsigned long len=strlen(s); 4 for (int i=0; i<=len/2; i++) { 5 ch=*(s+i); 6 *(s+i)=*(s+len-1-i); 7 *(s+len-1-i)=ch; 8 } 9 return s;10 }11 12 char *strcat1(char *s,const char *ct){13 char *p=s;14 while (*p!='/0') {15 p++;16 }17 18 while (*ct!='/0') {19 *p=*ct;20 p++;21 ct++;22 }23 return s;24 }25 26 int main(){27 //反轉(zhuǎn)字符串28 char str[100]="asdfer";29 printf("%s",reverse(str));30 char *qstr="kingkong";31 strcat1(str, qstr);32 printf("%s",str);33 return 0;34 }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注