#include <stdlib.h> #include <string.h> int main(){ char str[100] = "hello world"; char *p = "hello world"; //*p ='H';//常量字符串不可以修改,p指向只讀的地址 p = str; *p = 'H'; // printf("%s",str); p = (char*)malloc(100); //判空 if(p==NULL) return 0; //清零 memset(p,0,100); printf("p=%p\n",p); //字符串賦值 //memcpy(p, "helloworld", 10);//方法一:內存拷貝 sprintf(p,"%s","helloworld");//方法二:sprintf()輸出賦值 //p = "helloworld";//錯誤,p指向常量區,把申請的內存都丟了 printf("p=%p\n",p); printf("%s",p); //釋放 free(p); return 0; }
2)字符操作函數, 形參為對應參數的ASCII碼值,滿足條件返回1,不滿足返回0 ; 需要引用頭文件#include <ctype.h> 1、int isalnum(int);// 判斷是否是數字或者字母 2、int isalpha(int);//判斷是否是英文字符 3、int isdigit(int);//判斷是否是數字 0~9 4、int islower(int);//判斷是否是小寫字母 5、int isupper(int);//判斷是否是大寫字母 6、int isxdigit(int);//是否是16進制數字 7、int tolower(int);//轉成小寫 8、int toupper(int);//轉成大寫 9、int digittoint(int);//把十六進制數字字符轉換成整型 10、int ishexnumber(int);//等價 isxdigit 11、int isnumber(int);//等價isdigit 實例代碼:
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')); //1 10 printf("%c\n",tolower('A'));//a 11 printf("%c\n",toupper('a'));//A 12 printf("%d\n",digittoint('1'));//1 13 printf("%d\n",ishexnumber('a'));//1 14 printf("%d\n",isnumber('a'));//0 15 return 0; 16 }
3)字符串拷貝 使用strcpy或strncpy 後者可以指定拷貝長度。 實例代碼:
1 int main() 2 { 3 char str[20] ="XXXXXXXXXXXXXX"; 4 char *p = "hello"; 5 strcpy(str,p);//從p的位置拷貝字符串,把p後面的'\0'也拷貝過來.如果接收的字符串空 間不夠大,可能會越界 。 6 printf("%s\n",str);//從str開始,打印到\0結束 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);//最後的參數:最大拷貝字符數.一般設置為目的字符串bufsize-1,預留結束符 12 str[len-1] = '\0';//數組的最後的一個元素置為結束符 13 printf("%s\n",str);//從str開始,打印到\0結束 14 15 }
4)字符串比較函數 strcmp, strncmp 後者可以限定比較字符串的長度,如果相等比較結果等於0,如果s1>s2 結果大於0; 如果s1<s2 結果小於0;比較結果等於字符串中首個不相等字符的ascii碼的差值。 實例代碼:
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);//結果:-1 8 rst = strncmp(p1, p2, 2);//2表示比較的最大長度 9 printf("rst = %d\n",rst);//結果:0 10 return 0; 11 }
5)查找字符串函數 1、strchr 從左往右正向查找。 2、strrchr 從右往左逆向查找。 3、strstr 返回 s2字符串在s1字符串中第一次出現的位置,找不到對應的字串, 返回NULL。 實例代碼:
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)字符串拼接函數 1、strcat, 結構char *strcat(char *dst, const char *src) dst 指向的內存剩余的空間要足夠容納src字 符串,dst src 指向的內存不能重疊。 2、strncat,結構char *strncat(char *, const char *, size_t n) size_t n: 最大拼接字符個數//數組的長度-當前的有效個數-1(預留結束符) 實例代碼:
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)字符串分割函數 strtok 結構char *strtok(char *src, const char *demi)。 1、strtok 把src字符串中所有的分隔符變成'\0' 2、直接修改原字符串 3、只有第一次調用的時候需要傳遞字符串的首地址, 從第二次開始需要傳遞NULL 4、寫一個函數實現截取字符串並提取被截斷的任一部分字符 實現代碼:
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[] = "我愛#中華#人民#共和國"; 16 char sp[] = "#"; 17 char *spstr=str; 18 char *spf=sp; 19 char *result = (char*)splitstr(spstr,spf,2);//結果:人民 20 printf("%s",result); 21 return 0; 22 }
8)檢索字符串 1、strpbrk 函數;結構為 char *strpbrk(const char *s1, const char *s2);依次檢索s1中的字符, 當s2中也包含時,停止檢索,並返回該字符位置. 2、strspn 函數;結構為 size_t strspn(const char *s1, const char *s2);//s1中s1開頭連續的都在s2中的字符數 實例代碼:
1 int main() 2 { 3 char *p1 = "hello world"; 4 char *p2 = "girl"; 5 printf("%s\n",strpbrk(p1,p2));//'l'在p2也有,'l'是2個字符串的第一個公共字符,返回在p1中的地址 6 char *p3 = "lehRwsrt"; 7 printf("%lu\n",strspn(p1,p3));//p1中,前4個字符,在p3中也存在 8 return 0; 9 }
9)提取整數, 以數字開頭提取到字母截止 ;實現函數有 1、atoi 用於提取 int類型數據 2、atof 用於提取 double,float等浮點型數據 3、atol 用於提取 long 等長整形數據 實例代碼:
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)反轉字符串 實例代碼:
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 //反轉字符串 28 char str[100]="asdfer"; 29 printf("%s",reverse(str)); 30 char *qstr="qianfeng"; 31 strcat1(str, qstr); 32 printf("%s",str); 33 return 0; 34 }