跟一,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;
}