字符处理函数(自写)

跟一,strlen

传数组&&传指针

#include<stdio.h>
#include<string.h>
#define N 100
int mystrlen(const char str[]);//传字符数组
int mystrlen2(const char *str);//传字符指针
int main()
{
	char a[N]={"fergnv dflgojvag;;ldfbfbg bbtnbv"};
	printf("%d\n",mystrlen(a));
	printf("%d\n",mystrlen2(a));
	printf("%d\n",strlen(a));
	return 0;
}
int mystrlen(const char str[])
//const的作用是保护实参数组不被被调函数所修改,一旦修改,即非法操作,报警
{
	int cnt=0,i;
	for(i=0;str[i]!='\0';i++)
	{
		cnt+=1;
	}
	return cnt;
}
int mystrlen2(const char *pstr)
//const表示指向的是字符常量,保护指针变量指向的值不被修改
{
	int len=0;
	while(*pstr!='\0')//等价于while(*pstr)等价于while(*pstr!=0),即为真
	{
		pstr++;
		len+=1;
	}
/*更甚可以简化为while(*pstr++)
                {len++;}        */
	return len;
}
/*当然mystrlen2也可以不用len,而单纯用指针操作
{
const char *start=pstr;
while(*pstr)
{
pstr++;
}
return pstr-start;
}
*/

二,strcpy

传数组&&传指针

#include<stdio.h>
#include<string.h>
#define N 100
char * mystrcpy(char str1[],char str2[]);//传数组
char * mystrcpy2(char *str1,char *str2);//传指针
char *mystrcpy3(char *str1,const char *str2);//传指针,更简
int main()
{
	char a[N]={"jbhsgfdbbkvigkbjflbgighflghnhdb"};
	char b[N]={"china is a beautiful country."};
	char *result=NULL;
	result=mystrcpy(a,b);
	puts(result);
	return 0;
}
char * mystrcpy(char str1[],char str2[])
{
	char *res=str1;
	int i;
	for(i=0;str2[i]!='\0';i++)
	{
		str1[i]=str2[i];
	}
	str1[i]='\0';
	return res;
}
char * mystrcpy2(char *str1,char *str2)
{
	char *res=str1;
	while(*str2)//等价于while(*str2);等价于while(*str2!=0),为真
	{
		*str1++=*str2++;
	}
	*str1='\0';
	return res;
}
char *mystrcpy3(char *str1,const char *str2)
{
char *res=str1;
while(*str1++=*str2++);//循环在赋值空字符之后才会停止
return res;
}

三,strcat

传数组&&传指针

#include<stdio.h>
#include<string.h>
#define N 100
char *mystrcat(char *str1,char *str2);//传指针
char *mystrcat2(char str1[],char str2[]);//传数组
int main()
{
	char a[2*N+1]={"hospital,"};
	char b[N+1]={"world,war"};
	char *result = mystrcat2(a,b);
	puts(result);
	return 0;
}
char *mystrcat(char *str1,char *str2)
{
	char *res=str1;
	while(*str1!='\0')
	{
		str1++;
	}
	while(*str2!='\0')
	{
		*str1=*str2;
		str1++;
		str2++;
	}        
	*str1='\0';
	return res;
}
char *mystrcat2(char str1[],char str2[])
{
	char *res=str1;
	int i=0,j;
	while(str1[i]!='\0')
	{
		i+=1;
	}
	for(j=0;str2[j];i++,j++)
	{
		str1[i]=str2[j];
	}
	str1[i]='\0';
	return res;
}

 跟上面的strcat略有不同,这里没有在主函数中用数组,而使用的字符指针,用malloc分配内存空间,函数处也有点变化,不需要新定义指针作为返回值,只需用一开始的即可,中途不改变目标的指向,而是*(dst+i)的形式。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define N 100
char* MyStrcat(char *dest, char *source);
int main(void)
{
        char *first, *second, *result;
        printf("Input the first string:");
        first=(char*)malloc(N*sizeof(char));//分配空间
        gets(first);
        printf("Input the second string:");
        second=(char*)malloc(N*sizeof(char));//分配空间
        gets(second);
        result = MyStrcat(first, second);
        printf("The result is : %s\n", result);
        return 0;
}
char* MyStrcat(char *dest, char *source)
{
        int i = 0,j;
        while (*(dest+i)!='\0')   i++;
        for (j=0; *(source+j)!='\0';i++,j++)//i++在这
        {
            *(dest+i) = *(source+j); 
			//i+=1;//或者在这;不能共用i;source是从0开始的,另用一个j=0开始
        } 
        *(dest+i)='\0';
        return dest;
}

四,strcmp

传数组&&传指针

#include<stdio.h>
#include<string.h>
#define N 100
int mystrcmp(char str1[],char str2[]);//传数组
int mystrcmp2(char *str1,char *str2);//传指针
int main()
{
	//char *str;
	//str=(char *)malloc(N*sizeof(char));
	//get(str);
	char a[N]={"abandon"};
	char b[N]={"abaz"};
	int result=mystrcmp2(a,b);
	printf("%d\n",result);
	return 0;
}
int mystrcmp(char str1[],char str2[])
{
	int i,res;
	for(i=0;str1[i]!='\0'&&str2[i]!='\0'&&str1[i]==str2[i];i++);
	res=str1[i]-str2[i];
	if(res>0) return 1;
	else if(res<0) return -1;
	else return 0;
}
int mystrcmp2(char *str1,char *str2)
{
	int i=0,j=0,res;
	while(*(str1+i)!='\0'&&*(str2+i)!='\0'&&*(str1+i)==*(str2+i))
	{
		i++;
	}
	res=*(str1+i)-*(str2+i);
	if(res>0) return 1;
	else if(res<0) return -1;
	else return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值