字符串相关的常用函数及实现
0.前言
很多函数是基于笔者的理解实现的,实现效率、可读性甚至正确性都不是特别高
有任何错误,欢迎大家直接指出(QAQ
1.strcpy( )函数
strcpy(char *s1,char *s2)含有两个参数,均为字符串类型,作用是将s2字符串复制到s1的地址上
char a[]="abcd";
char b[]="def";
strcpy(a,b);
cout<<a<<endl;
//输出为def
当然也可以有别的操作:通过改变传入的地址,实现字符串的部分复制
char a[]="abcd";
char b[]='def';
strcpy(a+3,b);
cout<<a;
//输出为abcdef
//a+x,x应该小于a的长度,最后位置的\0会有问题
实现方法
char *strcpy(char *ss,char *s){
int k=0;
while(*(s+k)!='\0'){
ss[k]=s[k];
k++;
}
return ss;
}
2.strncpy()
与strcpy类似,但加上了复制长度的限制,有了更灵活的操作!
调用:strncpy(char *a , char *b , int k);
实现方法
char *strncpy(char *ss,char *s,int len){
int k=0;
while(*(s+k)!='\0'&&k<len){
ss[k]=s[k];
k++;
}
return ss;
}
3.strcat()
strcat(char *ss,char *s)
字符串拼接,将s拼接到ss之后
示例:
char a[]="abc";
char b[]="def";
strcat(a,b);
cout<<a;
//结果为:abcdef
实现方法
char *strcat(char *ss,char *s){
int len=strlen(ss);
int k=0;
while(*(s+k)!=k){
ss[len+k]=s[k];
k++;
}
return ss;
}
4.strncat()
strncat(char *ss,char *s,int a)
按照规律加了n,多了一个参数,应该都能猜到了吧(doge
实现方法
char *strncat(char *ss,char *s,int a){
int len=strlen(ss);
int k=0;
while(*(s+k)!='\0'&&k<a){
ss[len+k]=s[k];
k++;
}
if(a==strlen(s))ss[len+k]='\0';//没有这一行,会出现一些小问题,(•_•)?
return ss;
}
5.strcmp()
strcmp(char *a , char * b)
用于比较两个字符串的字典序,空字符小于其他字符
a小于b时,返回-1
a与b完全相同时,返回0
a大于b时,返回1
例如,对一组字符串降序排序
char *p[N];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(strcmp(p[i],p[j])<0)swap(p[i],p[j]);
}
}
实现方法
int strcmp(char *a,char *b){
while(*a!='\0'&&*b!='\0'){
if(*a<*b)return -1;
else if(*a>*b)return 1;
else{
a++;b++;
}
}
if(*a=='\0'&&*b=='\0')return 0;
if(*a!='\0')return 1;
else return -1;
}
6.strncmp()
strncmp(char *a,char *b,int k)
你猜猜是什么意思qwq
实现方法
int strncmp(char *a,char *b,int k){
while(*a!='\0'&&*b!='\0'&&k>0){
if(*a<*b)return -1;
else if(*a>*b)return 1;
else{
a++;b++;k--;
}
}
if((*a=='\0'&&*b=='\0')||k==0)return 0;//似乎只需要多一个长度判断即可
if(*a!='\0')return 1;
else return -1;
}
7.strchr
strchr(char *s,char c)
在s中寻找字符c第一次出现的地址,未找到则返回空指针
示例:
char s[]="abcdef";
char c='d';
cout<<strchr(s,c)<<;
//结果为 def
实现方法
char* strchr(char *s,char c){
while(*s!='\0'){
if(*s==c)return s;
else s++;
}
return NULL;
}
8.strrchr
strrchr(char *s,char c)
在s中寻找字符c最后一次出现的地址,未找到则返回空指针
示例:
char s[]="abcdefdefdefdef";
char c='d';
cout<<strchr(s,c)<<;
//结果为 def
实现方法
char *strrchr(char *s,char c){
int len=strlen(s);
while(len!=0){
if(*(s+len)==c)return s+len;
else len--;
}
return NULL;
}
9.strstr
strstr(char *s,char *a)
在字符串s中寻找a第一次出现的地址,未找到返回空指针
示例:
char a[]="abcdabcdabcd";
char b[]="cdab";
cout<<strstr(a,b);
//结果为cdabcdabcd
实现方法:
char *strstr(char *s,char *ss){
while(*s!='\0'){
if(*s==*ss){
if(strncmp(s,ss,strlen(ss))==0)return s;
else s++;
}
}
return NULL;
}