strlen函数:求字符串长度
形式:size_t strlen(const char*str)
1.strlen会在遍历到'\0‘结束,故字符数组或字符串中必须有\0或定义好字符数组的长度
2.strlen返回的字符串或字符数组长度不包含\0
3.strlen返回的是无符号类型,所以不可以相减(相减后结果仍然是无符号的)
下面我们自主实现一个mystrlen函数,共有三种实现方法:
①计数器实现
size_t mystrlen(const char*str){
assert(str!=NULL);
int count=0;
while(*str!='\0'){
count++;
str++;
}
return count;
}
②递归实现
size_t mystrlen(const char*str){
if(*str=='\0')
return 0;
else
return 1+mystrlen(str+1);
}
③指针实现
size_t mystrlen(const char*str){
char*p=str;
while(*p!='\0')
p++;
return p-str;
}
strcpy函数:字符串拷贝
形式:char*strcpy(const char*dest,char*src)
1.strcpy以\0结束,并且会将\0拷贝过去
char arr[]={'a','b','c'};//字符数组没有定义长度不会带有\0
char arr[20]={'a','b','c'};//定义字符数组长度后剩下的13个位置都自动带有\0
char arr[]={'a','b','c','\0'};//字符数组安放了\0
char arr[]="abcd";//字符串自带\0
2.目标字符串空间必须大于或等于源字符串的空间,以便有充足的空间将源字符串拷贝过去
3.目标字符串空间必须可修改(例如指针就不可修改)
char*arr1="efghijk";//常量字符串不可修改
char arr2[]="abcd";
strcpy(arr1,arr2);//不可行
下面我们定义一个mystrcpy来实现strcpy的功能:
char*mystrcpy(char*dest,const char*src){
assert(dest&&dest!=NULL)
while(*src!='\0'){
*dest++=*src++;
}
return dest;
}
通过调试可知,这个代码是错误的,那么问题在哪里呢?
第一,该代码的循环在*src是\0时直接跳过,不能拷贝出\0,不符合strcpy函数的作用
第二,该代码在赋值最后一个元素后遇到\0直接结束循环,那么dest就指向最后一个元素,而我们返回的是dest的地址,要想打印出来拷贝后的字符串应将dest指向首元素。
了解这些问题后我们更改代码:
char*mystrcpy(char*dest,const char*src){
assert(dest&&src!=NULL);
char*ret=dest;
while(*dest++=*src++){}
return ret;
}
strcat函数:链接字符串
形式:char*strcat(const cahr*dest,char*src)
1.源字符串中必须有\0来结束,目标字符串也要有\0来说明追加位置
2.目标字符串空间必须足够大以能放下源字符串
3.目标字符串必须可修改
下面我们来写mystrcat函数来实现strcat的作用:
char*mystrcat(char*dest,char*src){
assert(dest&&src);
char*ret;
while(*dest)//找目标字符串中的\0
dest++;
while(*dest++=*src++){;}
return ret;
}
strcmp函数:字符串比较
形式:size_t strcmp(const char*s1,const char*s2)
1.strcmp比较的不是字符串长度,而是字符串中对应位置的字符串大小(ASCⅡ码值),若相同就跳过,直到遇到不同的或\0结束
2.返回值>0的数字
下面我们用mystrcmp来实现strcmp的函数作用:
int mystrcmp(const char*s1,const char*s2){
assert(s1&&s2);
while(*s1==*s2){
if(*s1=='\0')
return 0;
s1++;
s2++;
}
if(*s1>*s2)
return 1;
else
return -1;
}
strstr函数:str2是否为str1的子串
形式:char*strstr(const char*str1,const char*str2)(返回str2在str1中第一次出现的位置)
下面我们写mystrstr函数来实现strstr函数的功能:
char*mystrstr(const char*str1,const char*str2){
char*s1=str1,*s2=str2;
char*cur=str1;
while(*cur!='\0'){
s1=cur;
s2=str2;
while(*s1&&*s2&&*s1==*s2){
s1++;
s2++;
}
if(*s2=='\0')
return (char*)cur;
cur++;
}
return NULL;
}
int main(){
char arr1[]="abcdefghijk";
char arr2[]="cdefg";
char*ret=mystrstr(arr1,arr2);
if(ret==NULL)
printf("找不到该字符串\n");
else
printf("%s\n",ret);
}
strncpy,strncat,strncmp函数:长度受限制的字符串函数
1.char*strncpy(char*dest,const char*src,int count)
int main(){
char arr1[]="abcdefghijk";
char arr2[]="cdefg";
strncpy(arr1,arr2,6);
printf("%s",arr1);
return 0;
}
2.char*strncat(char*dest,const char*src,size_t count)
int main(){
char arr1[20]="abcdefg\0XXXXX";
char arr2[]="ABXDCFG";
strncat(arr1,arr2,3);
printf("%s",arr1);
return 0;
}
3.int strncmp(const char*dest,const char*srcint count)
int main(){
char arr1[]:abcdef";
char arr2[]="abdsdvfvd";
int ret=strncmp(arr1,arr2,5);
printf("%d",ret);
return 0;
}