字符串常见函数及其实现

字符串相关的常用函数及实现

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值