方式一(计数器):
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)
{
int count = 0;
assert(str);
while (*str)
{
str++;
count++;
}
return count;
}
int main()
{
char str[] = "abcdf";
printf("%d ", my_strlen(str));
return 0;
}
方式二(迭代):
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)
{
int count = 0;
assert(str);
if (*str == '\0')
{
return 0;
}
else return 1 + my_strlen(str + 1);
}
int main()
{
char str[] = "abcdf";
printf("%d ", my_strlen(str));
return 0;
}
方法三:
指针运算
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
int my_strlen(char*s)
{
assert(s);
char* p = s;
while (*p != '\0')
p++;
return p-s;
}
int main()
{
char str[] = "abcdf";
printf("%d ", my_strlen(str));
return 0;
}
原字符串里必须有‘\0’。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
目标空间必须可修改:char*p="xxxxxx";是常量字符串,不可被修改。
void my_strcpy(char* dest, const char* src)
{
assert(src!=NULL);
assert(dest!=NULL);
while(*src!='\0')
{
*dest = *src;//拷贝\0之前的内容
dest++;
src++;
}
*dest = *src;//拷贝\0
}
第一次修改后:
void my_strcpy(char* dest, const char* src)
{
assert(src!=NULL);
assert(dest!=NULL);
while(*src!='\0')
{
*dest++ = *src++;//拷贝\0之前的内容
}
*dest = *src;//拷贝\0
}
第二次修改后:
后置++的优先级高,但是结果是后产生的。
void my_strcpy(char* dest, const char* src)
{
assert(src!=NULL);
assert(dest!=NULL);
while(*dest++ = *src++)
{
;
}
}
\0的asc码值为0,拷不过去。
模拟实现返回类型为char,对本代码再次进行修改:
char my_strcpy(char* dest, const char* src)
{
assert(src!=NULL);
assert(dest!=NULL);
char*ret=dest;
while(*dest++ = *src++)
{
;
}
return ret;//返回目标空间的起始地址
}
用来连接字符串
首先找到目标空间的\0(如果没有,不知道追加从哪儿开始),再拷贝数据。源字符串也必须以\0结尾,不然不知道什么时候结束。目标空间必须足够大且能够修改。
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;//记录原字符串的头指针
assert(dest != NULL);
assert(src != NULL);
while (*dest)//找到原字符串\0的下一位
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int my_strcmp(const char* str1, const char* str2)
{
int ret = 0;
assert(src != NULL);
assert(dest != NULL);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = str1;
while (*cur)
{
s1 = cur;
s2 = cur;
while(*s1!='\0'&&*s2!='\0'&&*s1 == *s2)
{
s1++;
s2++;
}
if(*s2=='\0')
{
return cur;
}
cur++;
}
return NULL;//找不到就返回空指针
}