strlen
字符串长度
计数器版
#include <stdio.h>
#include <assert.h>
#define MAX1 50
//size_t和unsigned int 是一样的,表示无符号整型,字符串长度不会是负数
unsigned int my_strlen(const char* arr)
{
assert(arr!=NULL);
unsigned int count=0;
while(*arr++!='\0')
{
count++;
}
return count;
}
int main()
{
char arr[MAX1]="";
printf("请输入你的字符串:\n");
gets(arr);
printf("字符串长度为:%d\n",my_strlen(arr));
return 0;
}
递归版
指针-指针
strcpy
字符串拷贝
//模拟实现strcpy
//字符串的拷贝
//strcpy()有两个参数,目标空间的起始地址,原空间的起始地址
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX1 50
#define MAX2 50
char* my_strcpy(char* dest, const char* src)//const保证,src不会被修改,如果while判断条件写反了,会报错
{
//while (*src != '\0')
//{
// *dest = *src;
// dest++;
// src++;
//}//把src中‘\0’之前的元素全都放在dest中了,此时的*src中只剩下‘\0’了
//
// //还要把'\0'也放进去
//*dest = *src;
assert(dest != NULL);//断言,如果括号里的dest为NULL时,会自动报错,需引头文件#include <assert.h>,为假则报错
assert(src != NULL);
char* ret=dest;//先保存下dest的起始地址
while (*dest++ = *src++)//当src到‘\0’时,\0的ASCII码值为0,等式为假,循环结束
{
;
}
return ret;//返回目标空间dest的起始地址
}
int main()
{
char arr1[MAX1] = "";
printf("请输入第一个字符串:\n");
gets(arr1);
char arr2[MAX2] = "";
printf("请输入第二个字符串:\n");
gets(arr2);
/*strcpy(arr1, arr2);
printf("%s\n", arr1);*/
my_strcpy(arr1, arr2);
printf("拷贝后的字符串内容为:\n");
printf("%s\n", arr1);
return 0;
}
strcat
字符串追加
#include <stdio.h>
#include <assert.h>
#define MAX1 50
#define MAX2 50
char* my_strcat(char * destination,const char* src)
{
assert(destination&&src);
char* ret=destination;//将destination的地址保存一下
//1、找到目标字符串的\0
//2、把源数据追加上去,包含\0
while(*destination)
{
destination++;
}
//当*dest指向\0时,跳出while,此时,*dest指的就是\0
//此时追加源字符串
while(*destination++=*src++)//一个一个赋值,当*str指向\0时,跳出while
{
;
}
return ret;
}
int main()
{
char arr1[MAX1]="";
printf("请输入第一个字符串:\n");
gets(arr1);
char arr2[MAX2]="";
printf("请输入要追加的字符串:\n");
gets(arr2);
my_strcat(arr1,arr2);
printf("追加后的字符串为:\n");
printf("%s\n",arr1);
return 0;
}
strcmp
字符串比较
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* s1,const char* s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s1=='\0')//只有相等才能进while,所以当*s1='\0'时,代表*s2也等于'\0'
{
return 0;
}
s1++;
s2++;
}
//当*s1和*s2不相等时,跳出循环,此时s1,s2指向的是那两个不相同的数,然后进入if语句
// if(*s1>*s2)
// {
// return 1;
// }
// else
// {
// return -1;
// }
//或者直接return *s1-*s2;
return *s1-*s2;
}
int main()
{
char* p="abcdegh";
char* q="dfgdfg";
int ret=my_strcmp(p,q);
printf("%d",ret);
return 0;
}
strstr
判断是否是子串
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1,const char* str2)
{
assert(str1&&str2);
const char* s1=NULL;
const char* s2=NULL;
const char* cp=str1;
while(*cp)
{
s1=cp;
s2=str2;
while(*s1&&*s2&&(*s1==*s2))
{
s1++;
s2++;
}
if(*s2=='\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[]="addfsdfdg";
char arr2[]="fsdf";
char* ret=my_strstr(arr1,arr2);
if(ret==NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n",ret);
}
return 0;
}