str系列---字符串函数
1、 strcat
extern char *strcat(char *dest,char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
返回指向dest的指针。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//将源字符串加const,表明其为输入参数 char* strcat(char* strDest , const char*s trSrc) { //后文return address,故不能放在assert断言之后声明address char* address=strDest; assert( (strDest!=NULL)&&(strSrc!=NULL) );//对源地址和目的地址加非0断言 while(*strDest)//是while(*strDest!=’\0’)的简化形式 { //若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++, //那么strDest将指向'\0'的下一个位置。/所以要在循环体内++;因为要是*strDest最后指 //向该字符串的结束标志’\0’。 strDest++; } while(*strDest++=*strSrc++) { NULL;//该循环条件内可以用++, }//此处可以加语句*strDest=’\0’;无必要 return address;//为了实现链式操作,将目的地址返回 }
2、 strchr
char * strchr (const char *s,int c);
找出参数s字符串中第一个出现的参数c地址,然后将该字符出现的地址返回。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
char*strchr(char *s,char c) { while(*s!='\0'&&*s!=c) { ++s; } return*s==c?s:NULL; }
3、 strrchr
char *strrchr(const char *str, char c);
查找一个字符c在另一个字符串str中末次出现的位置,然后将该字符出现的地址返回。
4、 strcmp
int strcmp(const char *s1,const char *s2);
当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/*strcmp function*/ #include <string.h> int strcmp(const char *sl,const char *s2) { /*compare unsigned char sl[],s2[]*/ for(;*sl==*s2;++sl,++s2) if(*sl=='\0') return(0); return((*(unsignedchar*)sl<*(unsignedchar*)s2)?-1:+1); }
5、 strcpy
extern char *strcpy(char* dest, const char *src);
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
返回指向dest的指针。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/********************** *C语言标准库函数strcpy的一种典型的工业级的最简实现 *返回值:目标串的地址。 *对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。 *参数:des为目标字符串,source为原字符串 */ char* strcpy(char* des,const char* source) { char* r=des; while((*(des++)=*(source++))!='\0'); return r; } /*while((*des++=*source++));的解释:赋值表达式返回左操作数,所以在赋值NULL后,循环停止*/
6、 strcasecmp
int strcasecmp (const char *s1, const char *s2);
用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。
7、 strcspn
size_t strcspn ( const char *s,const char * reject);
从参数s字符串的开头计算连续的字符,而这些字符都完全不在参数reject所指的字符串中。
返回字符串s开头连续不含字符串reject内的字符数目。
8、 strdup
extern char *strdup(char *s);
strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。
返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。
9、 strlen
extern unsigned int strlen(char *s);
计算字符串s的(unsigned int型)长度,不包括'\0'在内
返回s的长度,不包括结束符NULL。
10、 strpbrk
char *strpbrk(const char *cs,const char *ct);
依次检验字符串s1中的字符,当被检验字符在字符串s2中也包含时,则停止检验,并返回该字符位置,空字符NULL不包括在内。
返回s1中第一个满足条件的字符的指针,如果没有匹配字符则返回空指针NULL。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
char * strpbrk(const char * cs,const char * ct) { const char *sc1,*sc2; for( sc1 = cs; *sc1 != '\0'; ++sc1) { for( sc2 = ct; *sc2 != '\0'; ++sc2) { if (*sc1 == *sc2) { return (char *) sc1; } } } return NULL; }
11、 strspn
size_t strspn (const char *s,const char * accept);
strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int strspn(const char *s,const char *accept) { const char *p; const char *a; int count = 0; for(p = s; *p != '\0'; ++p) { for (a = accept; *a != '\0'; ++a) { if (*p == *a) { break; } }//里面的for循环到此为止 if (*a == '\0') { return count; } ++count; }//外面的for循环到此为止 return count; }
12、 strstr
char *strstr(const char *haystack,const char *needle);
strstr()会从字符串haystack 中搜寻字符串needle,并将第一次出现的地址返回;否则返回NULL。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
char *strstr(constchar*s1,constchar*s2) { int n; if(*s2) { while(*s1) { for(n=0;*(s1+n)==*(s2+n);n++) { if(!*(s2+n+1)) return(char*)s1; } s1++; } return NULL; } else return (char*)s1; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
char *strstr(const char*s1,const char*s2) { const char*p=s1; const size_tlen=strlen(s2); for(;(p=strchr(p,*s2))!=0;p++) { if(strncmp(p,s2,len)==0) return (char*)p; } return(0); }
13、 strtok
char * strtok(char *s,const char *delim);
用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步