文章目录
1,strlen
strlen - 求字符串长度
strlen返回的是字符串中’\0’之前出现的字符个数且不包括’\0’
1.1模拟实现strlen
int my_strlen(const char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
第二种方法是不使用变量
int my_strlen(const char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
我们字符串长度一定是大于1的所以是1+
my_strlen(str + 1):str+1判断第一个字符之后的字符
2,strcpy
copy顾名思义就是字符串拷贝。
2.1模拟实现strcpy
#include<assert.h>
char* my_strcpy(char* dest, const char* source)
{
char* ret = dest;
assert(dest && source);
while (*dest++ = *source++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
3,strcat
strcat-追加字符串
3.1模拟实现strcat
#include<assert.h>
char* my_strcat(char* dest, const char* source)
{
assert(dest && source);
char* ret = dest;
while(*dest != '\0')
{
dest++;
}
while (*dest = *source)
{
dest++;
source++;
}
return ret;
}
int main()
{
char arr[100] = "your ";
char arr2[] = "boss";
my_strcat(arr, arr2);
printf("%s", arr);
return 0;
}
先找到需要追加字符串的’\0’, 然后再把追加的字符串一 一追加进去。
4,strcmp
strcmp-比较字符串
因为g比b的ascll码大所以输出1。
4.1模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char arr[] = { "your" };
char arr2[] = { "your" };
int ret = my_strcmp(arr, arr2);
printf("%d", ret);
return 0;
}
5,strstr
strstr - 查找子字符串
abcdef 在a后三个字符与bcd相同所以输出bcdef。如果找到多次相等,也只会返回第一次的地址。
5.1模拟实现strstr
首先我们要知道最后的输出是第一次相同的地址开始,所以我们不能用str1 和str2进行遍历,而且str1的变量需要多一个,用来记第一次相同的地址
char* p1 = NULL;
char* p2 = NULL;
char* pc = (char*)str1;
arr1[] = “abcdef”;
arr2[] = “bcd”;
当我们p1 == p2时,p1++,p2++。如果p1 != p2,pc++。
然后再一次进入循环,pc只有当p1与p2不相等时才加加,所以遍历是p1来完成的,那p1 = pc就能很好的解决,
总循环的条件就是*pc != ‘\0’,这是大致的思路。
char* my_strstr(const char* str1, const char* str2)
{
char* p1 = NULL;
char* p2 = NULL;
char* pc = (char*)str1;
while (*pc != '\0')
{
p1 = pc;
p2 = (char*)str2;
while (*p1 && *p2 && *p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return pc;
}
pc++;
}
return NULL;
}
int main()
{
char arr1[] = { "abbbcde" };
char arr2[] = { "bcd" };
char* p = my_strstr(arr1, arr2);
if (p == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", p);
}
return 0;
}
对于*p1 && *p2 && *p1 == *p2
*p1 == '\0' 与*p2 == '\0'
都能使while停止
if (*p2 == '\0')
{
return pc;
}
当*p2 == ‘\0’,说明arr2[] = “bcd”;已经找完了,况且已经找到字符串。直接return就好了。
最后如果找不到,直接return空指针。
6,strtok
strtok-拆分字符串
看到这大家就懂什么意思了吧
7,strerror 与 perror
7.1strerror - 获取指向错误消息字符串的指针
这里就会显示没有这个文件,因为我根本没创建。也会告诉你为什么出的错误。
7.2 perror - 打印错误信息
7.3 两者区别
perror 相当于 printf + strerror